|
37082
|
1386
|
30
|
2026-05-13T15:36:24.423103+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686584423_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"bounds":{"left":0.1619016,"top":0.0,"width":0.31981382,"height":1.0},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"1","depth":4,"bounds":{"left":0.71476066,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.09896249,"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.09896249,"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
37081
|
NULL
|
NULL
|
NULL
|
|
37081
|
1386
|
29
|
2026-05-13T15:36:22.582844+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686582582_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5187215517464698470
|
-8348545152461722172
|
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
JetBrains AI
Search Everywhere
PhostormINavigarecodeFV faVsco.jsProiectReso vers© TextRelayService.phg?DraitsValidatorsC) BatchCriteria,ohoC) TextMessagin1BatchCriterialntertace.oC)BatchService.oho© BatchServicelnterface.p © UpdateElasticSearch.phcCSmailActivitvService.omtHristova 110 SmailActivitvServicelnte(C) EmailMessage.ohn• EmailMessageinterface.C) InboxService.php© InboxServicelnterface.p(1 InternetMeccagelnterfalc) MailchannelService.ong18.06.25 VasilevTextkelayselwice.ong› C MeetingGenerator0 Notification(7 OAuth2D Recallal>C Actions>C Commandsv MJobs© CreateBot.Job.phpDeleteBot.Job.php9.11.23 Hristova579.11.23Hristova 58© ImportBotRecording-RemoveBotFromCall.© SendAudioNotificatidlarwlaev O DatabaseV AEUA console 2 s 85 ms(l teams 2 s 915 ms(i crm configurations 1 s 350 msv & liminny@localhost«SF 718 msA HS localV APROD4, console 2 s 135 msV ASTAGINGAconsoleDocker© MailboxController.php• sso.onpossocontroller.ong©smsmessage.ong© SmsLength.php(C) UpdateActivityElasticSearchDocumentCommand.php x C)UpdateSinqleEntity.opho© ActivityStatusin.phpclass UodateActivitvElasticSearchDocumentCommand extends Commandpublic function handleo: voidupaacelarger. upoacelargectnum..AclIvLlyissyncevenc. crueSthis->info( string:'Done.'):} catch (\Exception Se) {sthas->error strinaFanled to uodate ES:"se->detlessadeon"Sthis->error(Se->aettraceAsStrinao):A7 Av= custom.logscratch &.ison= laravel.logA SF jiminny@localhost]& console [PROD)]A console (EU]tiò teams [EU]tii crm_configurations [EU]ImportBotRecordingJob.php x ©Activity.phpA console [STAGING]class ImportBotRecordingJob extends Job implements ShouldQueuepublic function handle(RecallAIService SrecallAIService): voidTanttttt t t tLoa. errordmessage: '[MeetingBot] ImportTracks: Recordings not found, retrying','activityUuid' => $this-›activity->getUuid.'activityID' => $this->activity->getIdO.lif (Sthis-›attempts• < $this->tries) ‹sch1s->release deselt::kciky SECUNUS} else {Sthis->activity->uodatecu"status' => Actavity::STATUS_FATLED.'recordanareason code' => Actavity:: FLAG RECORDING_REASON_MEETING BOT UNKNOWNSthis->fa1lo:returnsStrack = Sthis->createVideoTrackShotf'video uri'7):Sthic->cnoateAudioTnack(Stnacka•100% L2• Wed 13 May 18:36:22AskJiminnyReportActivityServiceTest vCascader Role SelecRetactoring User EmaDashboard Activity DeNew CascadeActivity Status vs Rec+0 ..A1ATnougntror 4ssearched conterenceralledeventin appThouaht for 2s >Read MeetingBotService.php #L540-589Searched update.'status."failed in appRead CreateBot.oho #L115-144|Read BotStatusChangeHandler.lob.ohv >Read BotStatusChangeHandlerJob.php #L410-459Searched status *=*STATUS FAILED in aoo/Services/RecallAIlRead ImoortBotRecording.lob.nhn #| 50-99Inought tor is>Based on my search, the code location where a conference activity can have status='failed' but recording state='rec/Lapp//Services/RecallAI//Jobs/ImportBotRecordingJob.php (line 59)• pho+ <> Code SWE-1.67 OutoutfF # and id = 32412fFR liminnv. text relavsfFR liminnv activities XTxBI W 1rwTys Auto1Q G64®ianquaadtranscrintion 1d! durationstatuson aircalendar event id! recording_stateI recording_preferencerecording reason codesummary reminder sentMloa reminder sent atMorganizer notified atimhas neconding nromnt? is internalen GB125090372245failed25540483recorded<null>32768<nul»<null><nul]>CSVW Windsurf Teams 51:62 UTF-8 f 4 spaces ®...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37080
|
1385
|
16
|
2026-05-13T15:36:21.131079+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686581131_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7...
|
[{"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<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"on_screen":true,"role_description":"text"}]...
|
-3238963201500087236
|
-7195615161230447674
|
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
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
7
iTerm2Shell EditViewSessionScriptsProfilesWindowHelplalnA100% <8• Wed 13 May 18:36:20DOCKER881DEV (docker)₴2APP (-zsh)83ec2-user@ip-10-20-31-146:~-zsh|84screenpipe"885ec2-user@ip-10-30-129-...86ec2-user@ip-10-20-31-14... 87[2026-05-13 15:28:23Jproduction.INFO:[SocialAccountService] Fetching"trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}token {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id":"edla364d-0b07-4c47-95a7-d22fd8ef6bec[2026-05-13 15:28:23] production.INFO: [SocialAccountService] Token needs refreshing {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id": "ed1a364d-0b07-4c47-95a7-d22fd8ef6bec","trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-13 15:28:23] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec"fef6-427a-4e63-a9ba-b340103c976b"},"trace_id":"1a72[2026-05-13 15:28:23] production.INFO: [SocialAccountService] Refreshing token from provider {"socialAccountId":30110, "provider": "hubspot","refreshToken": "9417a6a067cd68efa0bd023e970cc27482ef7db27b876a4383f5a246c4e8d81c", "state": "full-refresh"} {"correlation_id":"edla364d-0b07-4c47-95a7-d22fd8ef6bec", "trace_id": "1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-1315:28:23Jproduction.ERROR: [SocialAccountService] Failedto refresh token {"socialAccountId" :30110, "provider" : "hubspot",,"responseBody":"{\"status\":\"BAD_HUB\", \"message\":\"missing or unknown hub id\",\"correlationId\":\"019e21f4-1184-72ca-8C79-d9e09814baa4\", \"error)":\"access_denied\", \"error_description)":\"missing or unknown hub idl"}"3 {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec", "trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-13 15:28:23] production.INF0: [SocialAccountObserver] Saving model {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec","trace_id" :"1a72fef6-427a-4e63-a9ba-b340103c976b"}Flow refresh required.root@453da0675541:/home/jiminny# php artisan jiminny:token-info -A 30110-R[2026-05-13 15:28:31] production.INF0: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command": "jiminny:token-info"."memoryBeforeCommandInMb" :116.0,"memoryPeakBeforeCommandInMb":116.0} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"'}[2026-05-13 15:28:31] production.INFO: [SocialAccountService] Fetching token {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id":"b1e2505a-8c60-4607-a96a-a33209efd4c4, "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:31] production.INF0: [SocialAccountService]Token needs refreshing {"socialAccountId":30110,"provider": "hubspot"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:31] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4"9c48-df0f-4111-9988-d3bb8bf7bfa8"}"trace_id":"001e[2026-05-13 15:28:31] production.INFO: [SocialAccountService] Refreshing token from provider {"socialAccountId":30110, "provider": "hubspot","refreshToken": "9417aбa067cd68efa0bd023e970cc27482ef7db27b876a4383f5a246c4e8d81c","state": "full-refresh"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4".',"trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:32] production.ERROR: [SocialAccountService] Failed to refresh token {"socialAccountId":30110, "provider": "hubspot","responseBody":"{\"status\":\"BAD_HUB\", \"message\":\"missing or unknown hub id\",\"correlationId\":\"019e21f4-319c-7501-8b0e-d3118c6534f8\".,\"error)":\"access_denied\", \"error_description)":\"missing or unknown hub id\"}"}"correlation_id": "b1e2505a-8c60-4607-a96a-a33209efd4c4", "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:32] production.INFO: [SocialAccountObserver] Saving model {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8'"}Flow refresh required.root@453da0675541:/home/jiminny# [ec2-user@ip-10-20-31-146 ~]$ 0...
|
37078
|
NULL
|
NULL
|
NULL
|
|
37079
|
1386
|
28
|
2026-05-13T15:36:20.438243+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686580438_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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}]...
|
-83047842901774713
|
-7051219563329770554
|
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
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
PhostormINavigarecodeFV faVsco.jsProiectReso vers© TextRelayService.phg?DraitsValidatorsC) BatchCriteria,ohoC) TextMessagin1BatchCriterialntertace.oC)BatchService.oho© BatchServicelnterface.p © UpdateElasticSearch.phcCSmailActivitvService.omtHristova 110 SmailActivitvServicelnte(C) EmailMessage.ohn• EmailMessageinterface.C) InboxService.php© InboxServicelnterface.p(1 InternetMeccagelnterfalc) MailchannelService.ong18.06.25 VasilevTextkelayselwice.ong› C MeetingGenerator0 Notification(7 OAuth2D Recallal>C Actions>C Commandsv MJobs© CreateBot.Job.phpDeleteBot.Job.php9.11.23 Hristova579.11.23Hristova 58© ImportBotRecording-RemoveBotFromCall!© SendAudioNotificatidlarwlae-oсyv O DatabaseV AEUA console 2 s 85 ms(l teams 2 s 915 ms(i crm configurations 1 s 350 msv & liminny@localhost«SF 718 msA HS localV APROD4, console 2 s 135 msV ASTAGINGAconsoleDocker© MailboxController.php• sso.onpossocontroller.ong©smsmessage.ong© SmsLength.phg(C) UpdateActivityElasticSearchDocumentCommand.php x (C)UpdateSinqleEntity.php© ActivityStatusin.phpclass UodateActivitvElasticSearchDocumentCommand extends Commandpublic function handleo: voidupaacelarger. upoacelargectnum..AclLvLlypurpose: 'cli-command-activity-update-es',issyncevenc. crueSthis->info( string:'Done.'):} catch (\Exception Se) {sthas->error strinaFanled to uodate Es:"se->detlessadeon"Sthis->error(Se->aettraceAsStrina0):= custom.logscratch &.isonA SF jiminny@localhost]& ho_local Uiminny@localnost& console [PROD)]A console (EU]tiò teams [EU]tii crm_configurations [EU]lmporbotkecoraingJoo.ongxOAcuvicy.ongA console [STAGING]20.11.24 Nikolovclass 1пporubotkecorolngJod excenas Jod inplements shouLauueueA1A20.11.24 NIKOIpublic function handle(RecallAIService $recallAIService): void21.02.25 Stamatov41.02.40 Stamato21.02 25 Stamatou21.02.25 Stamatov21.02.25 Stamatov21.02.25 Stamatov21.02.20 Stamato21.02.2o Stamato4.03.20 Stamato4.03.20stamato4.[IP_ADDRESS].[IP_ADDRESS].03.254.03.257.03.257.03.2520.11.24 Nikolov20.11.24 Nikolov20.11.24 Nikolov20.11.24 Nikolov24.02.26 Stamatov24.02 26 StamatovLog::error(nessage: '[MeetingBot) ImportTracks: Recordings not found, retrying','activityluid' => $this-›activity->getUuidO.'activityID' => $this->activity->getIdO.lif (Sthis-›attempts• < Sthis->tries) {schis->release delay: selt:.kcikyscCUnus.n} else {Sthis-›activity->update(['status' => Actavity:: STATUSFAILED"recordingreason code'=> Activity::FLAG_RECORDING_REASON_MEETING_ BOT_UNKNOWN.1):sthns->farlo.return:Strack = Sthis->createVideoTrack(Shotr'video urz11):100% L2• Wed 13 May 18:36:20AskJiminnyReportActivityServiceTest vCascader Role SelecRetactoring User EmaDashboard Activity DeNew CascadeActivity Status vs Rec+0 ..Tnougntror 4ssearched conterenceralledeventin appThouaht for 2s >Read MeetingBotService.php #L540-589Searched update.'status."failed in appRead CreateBot.oho #L115-144|Read BotStatusChangeHandlerJob.php ›Read BotStatusChangeHandlerJob.php #L410-459Searched status *=*STATUS FAILED in aoo/Services/RecallAIlThought for 1s >Read ImoortBotRecording.lob.nhn #I 50-99Inought tor is>Based on my search, the code location where a conference activity can have status='failed' but recording state='rec/app/Services/RecallAI/Jobs/ImportBotRecordingJob.php (line 59)• pho+ <> Code SWE-1.67 OutoutfF # and id = 32412fFR liminnv. text relavsfFR liminnv activities XTxBI W 1rwTys Auto1Q G64®lanquaodtranscrintion 1d! durationstatuson aircalendar event id! recording_stateI recording_preferencerecording reason codesummary reminder sentMloa reminder sent atMorganizer notified atimhas neconding nromnt? is internalen GB125090372245failed25540483recorded<null>32768<nul»<null><nul]>W Windsurf Teams 51:62 UTF-8 f 4 spaces ®...
|
37077
|
NULL
|
NULL
|
NULL
|
|
37078
|
1385
|
15
|
2026-05-13T15:36:20.453147+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686580453_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}...
|
[{"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<br/>Some incoming commits are not fetched<br/>","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":"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":"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\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6991099392518100610
|
-3950736144691193050
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37077
|
1386
|
27
|
2026-05-13T15:36:18.011208+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686578011_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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}]...
|
-8091736795795357716
|
-3950736144558023898
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37076
|
1386
|
26
|
2026-05-13T15:36:08.280839+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686568280_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"1","depth":4,"bounds":{"left":0.71476066,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.09896249,"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.09896249,"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
37074
|
NULL
|
NULL
|
NULL
|
|
37075
|
1385
|
14
|
2026-05-13T15:36:08.293457+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686568293_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
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":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"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\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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,"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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
37073
|
NULL
|
NULL
|
NULL
|
|
37065
|
1385
|
10
|
2026-05-13T15:35:45.903721+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686545903_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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...
|
[{"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<br/>Some incoming commits are not fetched<br/>","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}]...
|
-7429716278976468786
|
-8636355650190325311
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
iTerm2Shell EditViewSessionScriptsProfilesWindowHelpA100% <8• Wed 13 May 18:35:45DOCKER₴81DEV (docker)₴2APP (-zsh)83ec2-user@ip-10-20-31-146:~-zsh|84screenpipe"О ₴5ec2-user@ip-10-30-129-...86ec2-user@ip-10-20-31-14... 87[2026-05-13 15:28:23Jproduction.INFO:[SocialAccountService] Fetching"trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}token {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id":"edla364d-0b07-4c47-95a7-d22fd8ef6bec[2026-05-13 15:28:23] production.INFO: [SocialAccountService] Token needs refreshing {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id": "ed1a364d-0b07-4c47-95a7-d22fd8ef6bec","trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-13 15:28:23] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec"fef6-427a-4e63-a9ba-b340103c976b"},"trace_id":"1a72[2026-05-13 15:28:23] production.INFO: [SocialAccountService] Refreshing token from provider {"socialAccountId":30110, "provider": "hubspot","refreshToken": "9417a6a067cd68efa0bd023e970cc27482ef7db27b876a4383f5a246c4e8d81c", "state": "full-refresh"} {"correlation_id":"edla364d-0b07-4c47-95a7-d22fd8ef6bec", "trace_id": "1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-1315:28:23Jproduction.ERROR: [SocialAccountService] Failedto refresh token {"socialAccountId" :30110, "provider" : "hubspot",,"responseBody":"{\"status\":\"BAD_HUB\", \"message\":\"missing or unknown hub id\",\"correlationId\":\"019e21f4-1184-72ca-8C79-d9e09814baa4\", \"error)":\"access_denied\", \"error_description)":\"missing or unknown hub idl"}"3 {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec", "trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-13 15:28:23] production.INF0: [SocialAccountObserver] Saving model {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec","trace_id" :"1a72fef6-427a-4e63-a9ba-b340103c976b"}Flow refresh required.root@453da0675541:/home/jiminny# php artisan jiminny:token-info -A 30110-R[2026-05-13 15:28:31] production.INF0: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command": "jiminny:token-info"."memoryBeforeCommandInMb" :116.0,"memoryPeakBeforeCommandInMb":116.0} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"'}[2026-05-13 15:28:31] production.INFO: [SocialAccountService] Fetching token {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id":"b1e2505a-8c60-4607-a96a-a33209efd4c4, "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:31] production.INF0: [SocialAccountService]Token needs refreshing {"socialAccountId":30110,"provider": "hubspot"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:31] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4"9c48-df0f-4111-9988-d3bb8bf7bfa8"}"trace_id":"001e[2026-05-13 15:28:31] production.INFO: [SocialAccountService] Refreshing token from provider {"socialAccountId":30110, "provider": "hubspot","refreshToken": "9417aбa067cd68efa0bd023e970cc27482ef7db27b876a4383f5a246c4e8d81c","state": "full-refresh"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4".',"trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:32] production.ERROR: [SocialAccountService] Failed to refresh token {"socialAccountId":30110, "provider": "hubspot","responseBody":"{\"status\":\"BAD_HUB\", \"message\":\"missing or unknown hub id\",\"correlationId\":\"019e21f4-319c-7501-8b0e-d3118c6534f8\".,\"error)":\"access_denied\", \"error_description)":\"missing or unknown hub id\"}"}"correlation_id": "b1e2505a-8c60-4607-a96a-a33209efd4c4", "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:32] production.INFO: [SocialAccountObserver] Saving model {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8'"}Flow refresh required.root@453da0675541:/home/jiminny# [ec2-user@ip-10-20-31-146 ~]$ 0...
|
37061
|
NULL
|
NULL
|
NULL
|
|
37064
|
1386
|
19
|
2026-05-13T15:35:42.357774+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686542357_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"bounds":{"left":0.1619016,"top":0.0,"width":0.31981382,"height":1.0},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"1","depth":4,"bounds":{"left":0.71476066,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.09896249,"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.09896249,"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37062
|
1386
|
17
|
2026-05-13T15:35:34.628210+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686534628_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-4095163947007314420
|
-7015479974376133692
|
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
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
PhostormINavicarecoderoledeyw0) CreateBotJob.ong© TextRelayService.phge) DeleteBotJob.ongc Imporbotkecoraing.RemoveBotFromCall.SendAudioNotificaticSendChatMessageJcStartRecordingJob.p(C) UpdateElasticSearch.ohgStopRecordingJob.pl 9.11.23Hristova 11_ WebhooksC) DatadoaMetricsService.9.11.23 Hristova23C) RecallAlService.phpc) ScreenShareService.ohia SecuritvStrategyM StreamindTeamM Telephony© ClientTokenGenerator.pc) InciahtsService nhn(c) NumberAllocator nhn(C) TeytMeccadinaServicer© TwilioClient.php© TwilioClientBuilder.php(c) TwilioService.php(C) TwilioSuhAccountCreatm llcorDilotD Webhook9.11.23 HristovaAostaciservice.ono© ActivityProviderFactory.phi18.06.25 Vasilev©) ActivityService.phoc)Apiresponseservice.phoc conterenceservice.phcc) Insiahtseatservice.phpc) Instantmeetingservice.phpcIntercomservice.ono© IpapiClient.phpCloaoiService.ohd© ParticinantShareService.oh18.06.25 Vasilev© PlanhatService.oho© PlaybackService.phpC) PlavhackVideo@nivServiceC) PlavbookcatedorvService.t1 PlavlistGeneratorinterface.1C) ResolveTeamCrmConnecti.011.22 Hrictova 57© SimpleThrottleService.php011.22 HrictovaC) SlackService nhnlC) SocialAccountService.nhn© SoftPhoneService.php© TeamDeactivatedService.p(c) [EMAIL](6) Toam Corvico nhn© MailboxController.phpossocontroller.ong©smsmessage.ong© SmsLength.phg(C) UpdateActivityElasticSearchDocumentCommand.php x C) UpdateSinqleEntity.php© ActivityStatusin.phpclass UodateActivitvElasticSearchDocumentCommand extends Commandpublic function handle(): voidSactivityld = $this-›argument( key: 'activityid'):$this->info( string: "Searching for activity with: {$activityld}"):if (is_numeric(Sactivityld)) 1Cactivitv = Activitv finddcint) Sactivitvtd)•} else {Sactivity = Activity::where( column:'uuid', tJiminny-Traits-RequiresUUID::to0ptimiztif (! Sactivity) {Sthis->error( string: "Activity with ID/UUID {SactivityId} not found");Sthis->info( string: "Found activity ID: {Sactivity->getIdO}. UUID: {Sactivity->qetUuiddsth1s->intol su'Sending activity for ES update...'):Sthis->eventDispatcher->dispatchdnew UodateSinaleEntitvoentitvid: Sactivity->oetidopurpose:Sthis->infod strina: "Done.")catch Excention Se)4$this->error( string: 'Failed to update ES: '. $e->getMessageO):cthic-sonnon/Co-saotTnaco/cCtninaon•100% 2• Wed 13 May 18:35:34U AskJiminnyReportActivityServiceTest v= custom.logscratch &.ison= laravel.logA SF jiminny@localhost]& console [PROD]CascadeA console (EU]tiò teams [EU]tii crm_configurations [EU]© ImportBotRecordingJob.php X A console [STAGING]r Role SelecRetactoring User EmaDashboard Activity DeNew CascadeActivity Status vs Rec+0 ..class 1прortborkecoraingJod excenas Jod Implements shoulauueueA1Apublic function handle(RecallAIService SrecallAIService): voidShot = SrecallATService->retrieveRot(Sthis-sactivitv->aetExternaltd00•iflemntv(Shot/'recordinas?))'[MeetingBot] ImportTracks: Recordings not found, retrying','activityUuid' => $this-›activity-›getUuid.acuivicylu → sunis-aculvityogerloif (Sthis->attempts( < $this->tries) {Sthis->release( delay: self::RETRY_SECONDS):else -sthis->activity->updare.= Actavity:: STATUS FATLEDI'recordina reason code' => Activity:: FLAG RECORDING REASONMEETING BOT UNKNOWNASthis->failo:returnsStrack = Sthis->createVideoTrackShotf'video unl?):Sthic-scnoateAudioTnacklCtnackdicnatch(new TmnontRecal1ATRecondinac.lohfrecordings: $bot['recordings'].track: $track,team: $this->activity->getTeamTnougntror 4ssearched conterenceralledeventin appThouaht for 2s >Read MeetingBotService.php #L540-589Read CreateBot.oho #L115-144|Read BotStatusChangeHandler.lob.oh >Read BotStatusChangeHandlerJob.php #L410-459Searched status *=*STATUS FAILED in aoo/Services/RecallAIlThought for 1s >Read ImoortBotRecording.lob.nhn #| 50-99Inought for isBased on my search, the code location where a conference activity can have status='failed' but recording state='recorded' is/app/Services/RecallAI/Jobs/ImportBotRecordingJob.php (line 59)"pho'recording reason_code' = Activity::FLAG_RECORDING_REASON MEETING BOT UNKNOWN,The slow.1. Recordina is captured and marked as recorded•In MeetinaBotServilce.oho line 739, onRecordinoStoopedo sets recording state to Activity::RECORDING REGORDED• This happens when the meeting ends and recordina stoos successfullv2 Later recordina imnort fails.• In ImportBotRecordingJob.php, when fetching the bot recording fails after max retries (line 59)•Status is set to STATUS FAILED• RUT recordina state is NOT undated - it remains as 'recorded!Result: Activity has status='failed' (because import failed) but recording state='recorded' (because recording wascantured before the import failure)This is different from other failure scenarios in Meet ingBotService.php (lines 481, 878) where both status ancrecordina state are set togetherr.al .private function createVideoTrack(2string SvideoUrl): Trackreturn sthis->activitv->trackso->uodateircreatetelenhony provider 1d => Sthis-ctivitv->detMeetindlrackProviderid tvoe: Track: :TYPE VIDE0))Ask anvthina (84L)« CodeSWE-16WN Windsurf Teamo101•62UTE.8io 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37061
|
1385
|
9
|
2026-05-13T15:35:35.508195+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686535508_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
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":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"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\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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,"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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37060
|
1385
|
8
|
2026-05-13T15:35:34.660155+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686534660_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error...
|
[{"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<br/>Some incoming commits are not fetched<br/>","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":"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":"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\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"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}]...
|
-5558904457466424365
|
-3664739978179409114
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error...
|
37059
|
NULL
|
NULL
|
NULL
|
|
37059
|
1385
|
7
|
2026-05-13T15:35:30.345647+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686530345_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes...
|
[{"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<br/>Some incoming commits are not fetched<br/>","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":"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}]...
|
-83047842901774713
|
-7051219563329770554
|
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
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
iTerm2Shell EditViewSessionScriptsProfilesWindowHelpA100% <8• Wed 13 May 18:35:30DOCKER881DEV (docker)₴2APP (-zsh)83ec2-user@ip-10-20-31-146:~-zsh|84screenpipe"О 85ec2-user@ip-10-30-129-...886ec2-user@ip-10-20-31-14... #7[2026-05-13 15:28:23Jproduction.INFO:[SocialAccountService] Fetching"trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}token {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id":"edla364d-0b07-4c47-95a7-d22fd8ef6bec[2026-05-13 15:28:23] production.INFO: [SocialAccountService] Token needs refreshing {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id": "ed1a364d-0b07-4c47-95a7-d22fd8ef6bec","trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-13 15:28:23] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec"fef6-427a-4e63-a9ba-b340103c976b"},"trace_id" :"1a72[2026-05-13 15:28:23] production.INFO: [SocialAccountService] Refreshing token from provider {"socialAccountId":30110, "provider": "hubspot", "refreshToken" : "9417a6a067cd68efa0bd023e970cc27482ef7db27b876a4383f5a246c4e8d81c", "state": "full-refresh"} {"correlation_id":"edla364d-0b07-4c47-95a7-d22fd8ef6bec", "trace_id": "1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-1315:28:23Jproduction.ERROR: [SocialAccountService] Failedto refresh token {"socialAccountId" :30110, "provider" : "hubspot",,"responseBody":"{\"status\":\"BAD_HUB\", \"message\":\"missing or unknown hub id\",\"correlationId\":\"019e21f4-1184-72ca-8C79-d9e09814baa4\", \"error)":\"access_denied\", \"error_description)":\"missing or unknown hub idl"}"3 {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec", "trace_id":"1a72fef6-427a-4e63-a9ba-b340103c976b"}[2026-05-13 15:28:23] production.INF0: [SocialAccountObserver] Saving model {"correlation_id":"ed1a364d-0b07-4c47-95a7-d22fd8ef6bec","trace_id" :"1a72fef6-427a-4e63-a9ba-b340103c976b"}Flow refresh required.root@453da0675541:/home/jiminny# php artisan jiminny:token-info -A 30110-R[2026-05-13 15:28:31] production.INF0: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command": "jiminny:token-info"."memoryBeforeCommandInMb" :116.0,"memoryPeakBeforeCommandInMb":116.0} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:31] production.INFO: [SocialAccountService] Fetching token {"socialAccountId":30110, "provider": "hubspot"} {"correlation_id":"b1e2505a-8c60-4607-a96a-a33209efd4c4, "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:31] production.INF0: [SocialAccountService]Token needs refreshing {"socialAccountId":30110,"provider": "hubspot"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:31] production.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4"9c48-df0f-4111-9988-d3bb8bf7bfa8"}"trace_id":"001e[2026-05-13 15:28:31] production.INFO: [SocialAccountService] Refreshing token from provider {"socialAccountId":30110, "provider": "hubspot","refreshToken": "9417aбa067cd68efa0bd023e970cc27482ef7db27b876a4383f5a246c4e8d81c","state": "full-refresh"} {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4".',"trace_id":"001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:32] production.ERROR: [SocialAccountService] Failed to refresh token {"socialAccountId":30110, "provider": "hubspot","responseBody":"{\"status\":\"BAD_HUB\", \"message\":\"missing or unknown hub id\",\"correlationId\":\"019e21f4-319c-7501-8b0e-d3118c6534f8\".,\"error)":\"access_denied\", \"error_description)":\"missing or unknown hub id\"}"}"correlation_id": "b1e2505a-8c60-4607-a96a-a33209efd4c4", "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8"}[2026-05-13 15:28:32] production.INFO: [SocialAccountObserver] Saving model {"correlation_id":"ble2505a-8c60-4607-a96a-a33209efd4c4", "trace_id": "001e9c48-df0f-4111-9988-d3bb8bf7bfa8'"}Flow refresh required.root@453da0675541:/home/jiminny# [ec2-user@ip-10-20-31-146 ~]$ 0...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37058
|
1386
|
16
|
2026-05-13T15:35:29.074042+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686529074_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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'...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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}]...
|
-4047408223668449518
|
-8636777727364969024
|
visual_change
|
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'
PhostormINavigarecodeProledeyw0) CreateBotJob.ong© TextRelayService.phge) DeleteBotJob.ongc Imporbotkecoraing.RemoveBotFromCall.© SendAudioNotificatic( SendChatMessageJcStartRecordingJob.p(C) UpdateElasticSearch.phoStopRecordingJob.pl 9.11.23Hristova 11_ WebhooksC) DatadoaMetricsService.9.11.23 Hristova23C) RecallAlService.phpc) ScreenShareService.ohia SecuritvStrategyM StreamindTeamM Telephony© ClientTokenGenerator.pc) InciahtsService nhn© NumberAllocator.php(C) TeytMeccadinaServicer© TwilioClient.php© TwilioClientBuilder.php(c) TwilioService.php(C) TwilioSuhAccountCreatm llcorDilotD Webhook9.11.23 HristovaAostaciservice.ono© ActivityProviderFactory.phi18.06.25 Vasilev©) ActivityService.phoc)Apiresponseservice.phoc conterenceservice.phcc) Insiahtseatservice.phpc) Instantmeetingservice.phpc)Intercomservice.ono© IpapiClient.phpCloaoiService.ohd© ParticinantShareService.oh18.06.25 Vasilev© PlanhatService.oho© PlaybackService.phpC) PlavhackVideo@nivServiceC) PlavbookcatedorvService.t1 PlavlistGeneratorinterface.1C) ResolveTeamCrmConnecti.011.22 Hrictova 57© SimpleThrottleService.php011.22 HrictovaC) SlackService nhnlC) SocialAccountService.nhn© SoftPhoneService.php© TeamDeactivatedService.p(c) [EMAIL](6) Toam Corvico nhn© MailboxController.phpossocontroller.ong©smsmessage.ong© SmsLength.php(C) UpdateActivityElasticSearchDocumentCommand.php x C) UpdateSinqleEntity.php© ActivityStatusin.phpclass UodateActivitvElasticSearchDocumentCommand extends CommandA7 A Ypublic function handle(): voidSactivityld = $this-›argument( key: 'activityid'):$this->info( string: "Searching for activity with: {$activityld}"):if (is_numeric(Sactivityld)) 1Cactivitv = Activitv. finddint) Sactivitvtd)•} else {Sactivity = Activity::where( column: 'uuid', tJiminny-Traits-RequiresUUID::to0ptimiztif (! Sactivity) {Sthis->error( string: "Activity with ID/UUID {SactivityId} not found");= custom.logscratch &.isonA SF jiminny@localhost]& console [PROD]A console (EU]tiò teams [EU]tii crm_configurations [EU]ImportBotRecordingJob.php X A console [STAGING]class 1прortborkecoraingJod excenas Jod Implements shoulauueuepubLic tunccion nanale kecaLLALservice srecaLLAlservice. vo1d1t emptysbot'recordings'0sage: 'LMeetingbot) Importiracks: Recordings not found, retrying'.activitvuuld' => sthis-›actvty->cetuuldoactivitvid' => sthis-›activity->getidoif (Sthis-›attemotso < sthis->tries) <Sthis->release( delay: self::RETRY_SECONDS);}else {$this->activity->update(['status' => Activity::STATUS_FAILED.'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,1):$this->failO:returnstrack = sth1s->createv1deolracksbotv1deo_urL'10*sthis->create.udno racklstrack):dispatch(new ImoortRecallAlRecordinas.00grecordinas: shot'recordinas'Sthis->info( string: "Found activity ID: {Sactivity->getIdO}. UUID: {Sactivity->qetUuidCsth1s->intol su'Sending activity for ES update...');Sthis->eventDispatcher->dispatchdnew UodateSinaleEntitvoentitvid: Sactivity->oetidopurpose:Sthis->infod strina: "Done. ")*catch Excention Se)4$this->error( string: 'Failed to update ES: '. $e->getMessageO):cthic-sonnon/Co-saotTnaco/cCtninaon•nrivate function createVideoTrackOstring Svideolir1)• Tracklreturn $this-›activity->tracks()->update0rCreate('telephony provider id' => Sthis-›activity->getMeetingTrackProviderId( type: Track::TYPE_ VIDEO).'type' => Track::TYPE VIDEO"1s master' => 0.asleenodaws'status' => Track::STATUS_ PENDING100% S2• Wed 13 May 18:35:28U AskJiminnyReportActivityServiceTest vCascader Role SelecA1ARetactoring User EmaDashboard Activity DeNew CascadeActivity Status vs Rec+0 ..Tnougntror 4ssearched conterenceralledeventin appThouaht for 2s >Read MeetingBotService.php #L540-589Read CreateBot.oho #L115-144|Read BotStatusChangeHandler.lob.ohn >Read BotStatusChangeHandlerJob.php #L410-459Searched status *=*STATUS FAILED in aoo/Services/RecallAIlRead ImoortBotRecording.lob.nhn #| 50-99Inought for isBased on my search, the code location where a conference activity can have status='failed' but recording state='recorded' is/app/Services/RecallAI/Jobs/ImportBotRecordingJob.php (line 59)• pho'recording reason_code' = Activity::FLAG_RECORDING_REASON MEETING BOT UNKNOWN,The slow.1. Recordina is captured and marked as recorded)•In MeetinaBotServilce.oho line 739, onRecordinoStoopedo sets recording state to Activity::RECORDING REGORDED• This happens when the meeting ends and recordina stoos successfullv2 Later recordina imnort fails.• In ImportBotRecordingJob.php, when fetching the bot recording fails after max retries (line 59)•Status is set to STATUS FAILED• RUT recordina state is NOT undated - it remains as 'recorded!Result: Activity has status='failed' (because import failed) but recording state='recorded' (because recording wascantured before the import failure)This is different from other failure scenarios in Meet ingBotService.php (lines 481, 878) where both status ancrecordina state are set togetherr.al .Ask anvthina (84L)« CodeSWE-16WN Windsurf Toams 82•64UTF.8io 4 spaces...
|
37057
|
NULL
|
NULL
|
NULL
|
|
37057
|
1386
|
15
|
2026-05-13T15:35:28.008499+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686528008_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"bounds":{"left":0.1619016,"top":0.0,"width":0.31981382,"height":1.0},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6991099392518100610
|
-3950736144691193050
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37056
|
1385
|
6
|
2026-05-13T15:35:28.046533+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686528046_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All...
|
[{"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<br/>Some incoming commits are not fetched<br/>","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":"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":"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\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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,"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}]...
|
7638119396218915760
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All...
|
37052
|
NULL
|
NULL
|
NULL
|
|
37055
|
1386
|
14
|
2026-05-13T15:35:24.878733+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686524878_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"bounds":{"left":0.1619016,"top":0.0,"width":0.31981382,"height":1.0},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"1","depth":4,"bounds":{"left":0.71476066,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.09896249,"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.09896249,"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"bounds":{"left":0.42985374,"top":0.09736632,"width":0.3081782,"height":0.90263367},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
37054
|
NULL
|
NULL
|
NULL
|
|
37054
|
1386
|
13
|
2026-05-13T15:35:23.749471+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686523749_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"bounds":{"left":0.1619016,"top":0.0,"width":0.31981382,"height":1.0},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"1","depth":4,"bounds":{"left":0.71476066,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.09896249,"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.09896249,"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"bounds":{"left":0.42985374,"top":0.09736632,"width":0.3081782,"height":0.8818835},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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}]...
|
-8468165139873418563
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37053
|
1386
|
12
|
2026-05-13T15:35:22.293544+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686522293_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"bounds":{"left":0.1619016,"top":0.0,"width":0.31981382,"height":1.0},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"1","depth":4,"bounds":{"left":0.71476066,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.09896249,"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.09896249,"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"bounds":{"left":0.42985374,"top":0.09736632,"width":0.3081782,"height":0.8818835},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
37051
|
NULL
|
NULL
|
NULL
|
|
37052
|
1385
|
5
|
2026-05-13T15:35:22.262687+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686522262_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
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":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"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\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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,"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}]...
|
841011344360644178
|
-3989588489578378452
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
37051
|
1386
|
11
|
2026-05-13T15:35:16.472376+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778686516472_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBotRecordingJob.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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint
.vscode
.windsurf
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
EventSubscriber
FilterDefinition
DealInsights, folder
Security, folder
TeamInsights, folder
ActivityActualDate.php, class
ActivityChannel.php, final class
ActivityDurationRange.php, class
ActivityFilter.php, final class
ActivityPlaylistIn.php, final class
ActivityProviderIn.php, final class
ActivityRecorded.php, class
ActivityRecordingStopped.php, final class
ActivityScheduledDate.php, final class
ActivityStatusIn.php, class
ActivityType.php, final class
ActivityUpdatedDate.php, final class
AiCallScoreFilter.php, final class
AutoScoreFilter.php, final class
ClosedDealsFilter.php, final class
CoachingFeedbackAverageScore.php, final class
CoachingFeedbackCoachUserIn.php, final class
CommentCountRange.php, final class
CrmFieldCollection.php, final class
CurrentStage.php, final class
Customer.php, final class
CustomerMonologueDuration.php, final class
CustomerQuestionCount.php, final class
DealAge.php, final class
DealCloseDate.php, final class
DealValue.php, final class
EngagingQuestionCount.php, final class
ExternalId.php, final class
HasPendingAiCrmNotes.php, final class
HasTopicTriggersFilterDefinition.php, final class
HasTranscription.php, final class
IndexedAtFrom.php, final class
InputTypeEnum.php, final class
InsightfulQuestionCount.php, final class
LanguageFilterDefinition.php, final class
LoggedToCrm.php, final class
NudgeRunId.php, final class
OnlyActiveUsers.php, final class
OrganiserGroupIn.php, class
OrganiserTeamIn.php, final class
OrganiserUserIn.php, class
OrganiserUserNotIn.php, final class
ParticipantUserIn.php, final class
PartnerFilterDefinition.php, final class
PatienceRange.php, final class
PlaybackTopicFilterDefinition.php, final class
ProviderFilterDefinition.php, final class
ShowInternalExternalActivitiesFilter.php, final class
SortBy.php, final class
SpeechRate.php, final class
StageAtCallFilterDefinition.php, class
TalkTimeRatio.php, final class
TeamMemberUserIn.php, final class
TranscriptionComposite.php, final class
UserGroupInOptionalFilter.php, final class
UserMonologueDuration.php, final class
UserQuestionCount.php, final class...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"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":"7","depth":4,"bounds":{"left":0.38430852,"top":0.19952115,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.19792499,"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.19792499,"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\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","depth":4,"bounds":{"left":0.1619016,"top":0.0,"width":0.31981382,"height":1.0},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Console\\Commands\\Activities;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Jiminny\\Contracts\\ES\\Events\\UpdateSingleEntity;\nuse Jiminny\\Contracts\\ES\\UpdateTargetEnum;\nuse Jiminny\\Models\\Activity;\n\nclass UpdateActivityElasticSearchDocumentCommand extends Command\n{\n protected $signature = 'activity:update:es {activityId}';\n protected $description = 'Update ES document synchronously';\n\n public function __construct(private readonly Dispatcher $eventDispatcher)\n {\n parent::__construct();\n }\n\n public function handle(): void\n {\n $activityId = $this->argument('activityId');\n\n $this->info(\"Searching for activity with: {$activityId}\");\n\n if (is_numeric($activityId)) {\n $activity = Activity::find((int) $activityId);\n } else {\n $activity = Activity::where('uuid', \\Jiminny\\Traits\\RequiresUUID::toOptimized($activityId))->first();\n }\n\n if (! $activity) {\n $this->error(\"Activity with ID/UUID {$activityId} not found\");\n\n return;\n }\n\n $this->info(\"Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}\");\n $this->info('Sending activity for ES update...');\n\n try {\n $this->eventDispatcher->dispatch(\n new UpdateSingleEntity(\n entityId: $activity->getId(),\n updateTarget: UpdateTargetEnum::ACTIVITY,\n purpose: 'cli-command-activity-update-es',\n isSyncEvent: true,\n )\n );\n\n $this->info('Done.');\n } catch (\\Exception $e) {\n $this->error('Failed to update ES: ' . $e->getMessage());\n $this->error($e->getTraceAsString());\n }\n }\n}","role_description":"text entry area","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":"1","depth":4,"bounds":{"left":0.71476066,"top":0.10055866,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.09896249,"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.09896249,"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\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\n }\n}","depth":4,"bounds":{"left":0.42985374,"top":0.09736632,"width":0.3081782,"height":0.8818835},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Services\\RecallAI\\Jobs;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue;\nuse Jiminny\\Jobs\\ImportRecallAIRecordingsJob;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Track;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Services\\RecallAI\\RecallAIService;\n\nclass ImportBotRecordingJob extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n private const int RETRY_SECONDS = 120;\n\n public int $tries = 2;\n\n public $queue = Queue\\BotsQueueConstants::BOTS_IMPORT_TRACKS;\n\n public function __construct(private readonly Activity $activity)\n {\n }\n\n /**\n * Import video tracks from Recall.ai to client-data S3 bucket\n */\n public function handle(RecallAIService $recallAIService): void\n {\n Log::info(\n '[MeetingBot] ImportTracks: START Importing tracks for activity: '\n . $this->activity->getUuid(),\n [\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n $bot = $recallAIService->retrieveBot($this->activity->getExternalId());\n\n if (empty($bot['recordings'])) {\n Log::error(\n '[MeetingBot] ImportTracks: Recordings not found, retrying',\n [\n 'activityUuid' => $this->activity->getUuid(),\n 'activityID' => $this->activity->getId(),\n ]\n );\n\n if ($this->attempts() < $this->tries) {\n $this->release(self::RETRY_SECONDS);\n } else {\n $this->activity->update([\n 'status' => Activity::STATUS_FAILED,\n 'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,\n ]);\n\n $this->fail();\n }\n\n return;\n }\n\n $track = $this->createVideoTrack($bot['video_url']);\n\n $this->createAudioTrack($track);\n\n dispatch(\n new ImportRecallAIRecordingsJob(\n recordings: $bot['recordings'],\n track: $track,\n team: $this->activity->getTeam()\n )\n );\n }\n\n private function createVideoTrack(?string $videoUrl): Track\n {\n return $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),\n ],\n [\n 'type' => Track::TYPE_VIDEO,\n 'is_master' => 0,\n 'is_shadow' => 0,\n 'status' => Track::STATUS_PENDING,\n 'format' => Track::FORMAT_MP4,\n 'start_time' => $this->activity->getActualStartTime(),\n 'end_time' => $this->activity->getActualEndTime(),\n 'provider_content_url' => $videoUrl,\n ]\n );\n }\n\n private function createAudioTrack(Track $videoTrack): void\n {\n $this->activity->tracks()->updateOrCreate(\n [\n 'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),\n ],\n [\n 'type' => Track::TYPE_AUDIO,\n 'is_master' => $videoTrack->getIsMaster(),\n 'is_shadow' => 1,\n 'start_time' => $videoTrack->getStartTime(),\n 'end_time' => $videoTrack->getEndTime(),\n 'format' => $videoTrack->getFormat(),\n 'status' => Track::STATUS_PENDING,\n ]\n );\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, 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","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":"InviteUserToTeamAction.php, class","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MarkUserAsOnboardableAction.php, class","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncRecordingFlagsAction.php, class","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UpdateTeamMemberAction.php, class","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UpdateUserRolesAction.php, class","depth":9,"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":"EventSubscriber","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinition","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights, folder","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Security, folder","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TeamInsights, folder","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityActualDate.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityChannel.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityDurationRange.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityFilter.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityPlaylistIn.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityProviderIn.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityRecorded.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityRecordingStopped.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityScheduledDate.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityStatusIn.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityType.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityUpdatedDate.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoreFilter.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AutoScoreFilter.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ClosedDealsFilter.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedbackAverageScore.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedbackCoachUserIn.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CommentCountRange.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CrmFieldCollection.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CurrentStage.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Customer.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CustomerMonologueDuration.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CustomerQuestionCount.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealAge.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealCloseDate.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealValue.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EngagingQuestionCount.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ExternalId.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"HasPendingAiCrmNotes.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"HasTopicTriggersFilterDefinition.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"HasTranscription.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IndexedAtFrom.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"InputTypeEnum.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"InsightfulQuestionCount.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LanguageFilterDefinition.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LoggedToCrm.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"NudgeRunId.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"OnlyActiveUsers.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserGroupIn.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserTeamIn.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserUserIn.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserUserNotIn.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantUserIn.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PartnerFilterDefinition.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PatienceRange.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTopicFilterDefinition.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProviderFilterDefinition.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ShowInternalExternalActivitiesFilter.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SortBy.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SpeechRate.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"StageAtCallFilterDefinition.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TalkTimeRatio.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TeamMemberUserIn.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TranscriptionComposite.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UserGroupInOptionalFilter.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UserMonologueDuration.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UserQuestionCount.php, final class","depth":11,"on_screen":false,"role_description":"text"}]...
|
8807433867291795141
|
-8600139792141661426
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Console\Commands\Activities;
use Illuminate\Console\Command;
use Illuminate\Contracts\Events\Dispatcher;
use Jiminny\Contracts\ES\Events\UpdateSingleEntity;
use Jiminny\Contracts\ES\UpdateTargetEnum;
use Jiminny\Models\Activity;
class UpdateActivityElasticSearchDocumentCommand extends Command
{
protected $signature = 'activity:update:es {activityId}';
protected $description = 'Update ES document synchronously';
public function __construct(private readonly Dispatcher $eventDispatcher)
{
parent::__construct();
}
public function handle(): void
{
$activityId = $this->argument('activityId');
$this->info("Searching for activity with: {$activityId}");
if (is_numeric($activityId)) {
$activity = Activity::find((int) $activityId);
} else {
$activity = Activity::where('uuid', \Jiminny\Traits\RequiresUUID::toOptimized($activityId))->first();
}
if (! $activity) {
$this->error("Activity with ID/UUID {$activityId} not found");
return;
}
$this->info("Found activity ID: {$activity->getId()}, UUID: {$activity->getUuid()}");
$this->info('Sending activity for ES update...');
try {
$this->eventDispatcher->dispatch(
new UpdateSingleEntity(
entityId: $activity->getId(),
updateTarget: UpdateTargetEnum::ACTIVITY,
purpose: 'cli-command-activity-update-es',
isSyncEvent: true,
)
);
$this->info('Done.');
} catch (\Exception $e) {
$this->error('Failed to update ES: ' . $e->getMessage());
$this->error($e->getTraceAsString());
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\RecallAI\Jobs;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue;
use Jiminny\Jobs\ImportRecallAIRecordingsJob;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Jiminny\Models\Activity;
use Jiminny\Models\Track;
use Jiminny\Jobs\Job;
use Jiminny\Services\RecallAI\RecallAIService;
class ImportBotRecordingJob extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
private const int RETRY_SECONDS = 120;
public int $tries = 2;
public $queue = Queue\BotsQueueConstants::BOTS_IMPORT_TRACKS;
public function __construct(private readonly Activity $activity)
{
}
/**
* Import video tracks from Recall.ai to client-data S3 bucket
*/
public function handle(RecallAIService $recallAIService): void
{
Log::info(
'[MeetingBot] ImportTracks: START Importing tracks for activity: '
. $this->activity->getUuid(),
[
'activityID' => $this->activity->getId(),
]
);
$bot = $recallAIService->retrieveBot($this->activity->getExternalId());
if (empty($bot['recordings'])) {
Log::error(
'[MeetingBot] ImportTracks: Recordings not found, retrying',
[
'activityUuid' => $this->activity->getUuid(),
'activityID' => $this->activity->getId(),
]
);
if ($this->attempts() < $this->tries) {
$this->release(self::RETRY_SECONDS);
} else {
$this->activity->update([
'status' => Activity::STATUS_FAILED,
'recording_reason_code' => Activity::FLAG_RECORDING_REASON_MEETING_BOT_UNKNOWN,
]);
$this->fail();
}
return;
}
$track = $this->createVideoTrack($bot['video_url']);
$this->createAudioTrack($track);
dispatch(
new ImportRecallAIRecordingsJob(
recordings: $bot['recordings'],
track: $track,
team: $this->activity->getTeam()
)
);
}
private function createVideoTrack(?string $videoUrl): Track
{
return $this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_VIDEO),
],
[
'type' => Track::TYPE_VIDEO,
'is_master' => 0,
'is_shadow' => 0,
'status' => Track::STATUS_PENDING,
'format' => Track::FORMAT_MP4,
'start_time' => $this->activity->getActualStartTime(),
'end_time' => $this->activity->getActualEndTime(),
'provider_content_url' => $videoUrl,
]
);
}
private function createAudioTrack(Track $videoTrack): void
{
$this->activity->tracks()->updateOrCreate(
[
'telephony_provider_id' => $this->activity->getMeetingTrackProviderId(Track::TYPE_AUDIO),
],
[
'type' => Track::TYPE_AUDIO,
'is_master' => $videoTrack->getIsMaster(),
'is_shadow' => 1,
'start_time' => $videoTrack->getStartTime(),
'end_time' => $videoTrack->getEndTime(),
'format' => $videoTrack->getFormat(),
'status' => Track::STATUS_PENDING,
]
);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint
.vscode
.windsurf
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
EventSubscriber
FilterDefinition
DealInsights, folder
Security, folder
TeamInsights, folder
ActivityActualDate.php, class
ActivityChannel.php, final class
ActivityDurationRange.php, class
ActivityFilter.php, final class
ActivityPlaylistIn.php, final class
ActivityProviderIn.php, final class
ActivityRecorded.php, class
ActivityRecordingStopped.php, final class
ActivityScheduledDate.php, final class
ActivityStatusIn.php, class
ActivityType.php, final class
ActivityUpdatedDate.php, final class
AiCallScoreFilter.php, final class
AutoScoreFilter.php, final class
ClosedDealsFilter.php, final class
CoachingFeedbackAverageScore.php, final class
CoachingFeedbackCoachUserIn.php, final class
CommentCountRange.php, final class
CrmFieldCollection.php, final class
CurrentStage.php, final class
Customer.php, final class
CustomerMonologueDuration.php, final class
CustomerQuestionCount.php, final class
DealAge.php, final class
DealCloseDate.php, final class
DealValue.php, final class
EngagingQuestionCount.php, final class
ExternalId.php, final class
HasPendingAiCrmNotes.php, final class
HasTopicTriggersFilterDefinition.php, final class
HasTranscription.php, final class
IndexedAtFrom.php, final class
InputTypeEnum.php, final class
InsightfulQuestionCount.php, final class
LanguageFilterDefinition.php, final class
LoggedToCrm.php, final class
NudgeRunId.php, final class
OnlyActiveUsers.php, final class
OrganiserGroupIn.php, class
OrganiserTeamIn.php, final class
OrganiserUserIn.php, class
OrganiserUserNotIn.php, final class
ParticipantUserIn.php, final class
PartnerFilterDefinition.php, final class
PatienceRange.php, final class
PlaybackTopicFilterDefinition.php, final class
ProviderFilterDefinition.php, final class
ShowInternalExternalActivitiesFilter.php, final class
SortBy.php, final class
SpeechRate.php, final class
StageAtCallFilterDefinition.php, class
TalkTimeRatio.php, final class
TeamMemberUserIn.php, final class
TranscriptionComposite.php, final class
UserGroupInOptionalFilter.php, final class
UserMonologueDuration.php, final class
UserQuestionCount.php, final class...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89186
|
3037
|
0
|
2026-05-28T17:58:07.562536+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991087562_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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":"12","depth":4,"bounds":{"left":0.42519948,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.4368351,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.44780585,"top":0.17318435,"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.45511967,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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.4637633,"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.47240692,"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.48337767,"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.49202126,"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.5006649,"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.51163566,"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.5226064,"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.54920214,"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.56017286,"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.70146275,"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":"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":"31","depth":4,"bounds":{"left":0.6605718,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.6722075,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"31","depth":4,"bounds":{"left":0.6821808,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.6938165,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"}]...
|
8166911706858540368
|
-6928738992425690524
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89185
|
3036
|
0
|
2026-05-28T17:58:07.665916+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991087665_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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":"ServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'ServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ServiceTest'","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":"12","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6100184928929385475
|
-6928176033883448732
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89184
|
NULL
|
0
|
2026-05-28T17:58:00.009377+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991080009_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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":"12","depth":4,"bounds":{"left":0.42519948,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.4368351,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.44780585,"top":0.17318435,"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.45511967,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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.4637633,"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.47240692,"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.48337767,"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.49202126,"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.5006649,"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.51163566,"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.5226064,"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.54920214,"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.56017286,"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.70146275,"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":"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":"31","depth":4,"bounds":{"left":0.6605718,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.6722075,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"31","depth":4,"bounds":{"left":0.6821808,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.6938165,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"113","depth":4,"bounds":{"left":0.7037899,"top":0.123703115,"width":0.011303191,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.71675533,"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.7240692,"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 team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","depth":4,"on_screen":true,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","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}]...
|
1334187259635969830
|
2146598106808366701
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
89183
|
NULL
|
NULL
|
NULL
|
|
89183
|
3035
|
43
|
2026-05-28T17:57:46.653764+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991066653_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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":"12","depth":4,"bounds":{"left":0.42519948,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.4368351,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.44780585,"top":0.17318435,"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.45511967,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6100184928929385475
|
-6928176033883448732
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89182
|
NULL
|
0
|
2026-05-28T17:57:44.248864+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991064248_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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":"ServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'ServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ServiceTest'","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":"12","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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":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":"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":"31","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"31","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"113","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 team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","depth":4,"on_screen":true,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","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}]...
|
1334187259635969830
|
2146598106808366701
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
89179
|
NULL
|
NULL
|
NULL
|
|
89181
|
3035
|
42
|
2026-05-28T17:57:16.001028+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991036001_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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":"12","depth":4,"bounds":{"left":0.42519948,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.4368351,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.44780585,"top":0.17318435,"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.45511967,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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.4637633,"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.47240692,"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.48337767,"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.49202126,"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,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8524628913763569962
|
-6928176033882334620
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…...
|
89180
|
NULL
|
NULL
|
NULL
|
|
89180
|
3035
|
41
|
2026-05-28T17:57:12.818957+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991032818_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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}]...
|
1101258516708334978
|
-9211620050090884732
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
PhpStormEV faVsco,ls ~ProjectvViewCooc#12121 on JY-20963-fix-InWindow© ServiceTest.php© HubspotAppUninstalLJob.fimportaccountostonto© ImportBatchJobTrait.phpemoorcontconcron©ImportOpportunityBatch.pUmacurayochict.on© CachedCrmServiceDecorator.php© DeleteObjects Trait.phpRecordSelector.php© Team,phphuosooswo..noocxea.cokecontrooenisynostorec.Coseowaisto.osseiwice.onImportBatchJcbTrait.phpx© ProcessinternalWethookEcrmantityRepos.tory.phprart noortbarch.obtrayprorected tuncizon process noor sarchewaeweaweocsE SalesforceC Autolon Delavedtocrm oho© CheckAndRetryRemoteMatchCcreatefollowuoactmiy oho(C)ereateNotes ohoC MatchActvitiestoNeweooor©MatchActivityCrmData.phpE Notee biectono© SaveActivity.php© SaveTranscription.php© SetupLayout.php©SyncActivity.php© SyncFieidMetadata.php© SyncHubspotObjects.php© SyncLeads.php© SyncObjects.php© SyncOpportunities.Job.php© SyncOpportunity.php© SyncProfileMetadata.phpe GunaTosmSiahe lah nhoif (1 ScrnService instanceof HubspotInterface) (Log::error(message: Sthis->getLogPrefixO)* CRM service is not HubSpot', ["scaConfigucationld' = Sthis->craConfigurationid,'serviceClass' = ScrnService::class,1):TecornLog: : info( message: Sthis->getLogPrefix() .' Processing batch', l"crnConfigurationid' => Sthis->crnConfigurationid,"batchSize' => count(Sthis-›crnids),E BE E1):SfilteredIds = $this->filterExisting0bjects(ScrnConfig, ScrnEntityRepository);if Cenpty(SfilteredIds)) {Log:: info( message: Sthis->getLogPrefix(). ' No existing objects found in Jininny, skipping batch', l'graConfigurationid' = Sthis->craConfigurationid,reouescedcoun = countsthts-scraos120Services+,ocv Moatabasd@ Outpurt10 rowsDidy799900419988851jiminny.opportunitiesiid fiminny stageE Result: 34Resule 47 x Txgis_won Yopp_probability YI stage_prob V4 console 2 s 845 msell users 1 s 548 ms#liminny@localhostAHS JocalA SFV A PRODA consoleV A STAGING& consoleDockersaalac "TH:[CREDIT_CARD] crn_provider_id P100.00 208480441100.00 208480441108.00 208480441100100.00 208488441100.00 288488441100.00 208488441108.00 208480441Maguaa nagkeollole MursreSMWASSWNoTANDeonwesanswilcomolatar.lkminutas.oE custom.logE Iaravellogconsole (EU]xE users (EU)4 SF [iminny@locahost]A console (STAGING)D6000 0TE Alco ytE cc.provider = "hubspot"ID s.probability = 100ID o.is_won = 0ID o.deleted_at IS NULLID s.deleted_at IS NULL1D o.created_at > '2025-10-13*:A HS.Jocal (jiminny@localhost)A console (PROD]68 jminey~031 49 A31 23 213 A VECTSUMCCASE WHEN O.updated_at < ^2825-18-13' THEN 1 ELSE 0 END) as before_fix,SUMCCASE WHEN O.updated_at >= *2025-10-13* THEN 1 ELSE 0 END) as after_fix,COUNT(*) as total1 stages s 1.n<->1: ON s.id = o.stage_idcon conSiqurations ce1.nc-s1: OM cc.idins.oon consiauratsiion jaIE cc.provider = 'hubspot"sunnohabtiuty taal1D o.is_won = 0ID o.deleted_at IS NULLID s.deleted_at IS NULL;[CREDIT_CARD]=1814ECT o.1d, o.is_won, O.probability as opp_probability,s.probability as stage_prob, s.crn_provider_id,o.created_attopportunities o1 stages s 1.n<-›1: ON s.id = o.stage_idE o.tean_id = 416 AND o.created_at > '2026-85-28' AND S-probability = 100ER BY O.created_at DESC LIMIT 10;created_at Y2826-05-28 17:48:162026-05-28 17:48:162826-05-28 17:43:272024-95.28 17:27:172004-A6-20 14:40-902926-05-28 16:49:692826-05-28 16:49:082026-05-28 16:38:322826-85-28 16:38:31DankrACDe 1X2.2Thu 28 May 20:57:12U ServiceTest ~Salesforce Service Telory cre provider ealsorce oelcdonkoturooeooonurcoortStaoes sets cre cont louration id on stages. But look at the ucnteon reate n coort Stages - the search keviSstage = Sthis->config-»stages()-swithTrashed()-›update0rCreateliwssloromoatyeeeSthis-›config-»stages() scopes to cre_configuration_1d = 331, so the upsert correctly finds/creates within that config.Thattetndo grep =2 *5-n "crm_configuration_id™ /Users/lukas/jiminny/app/database/nigrations/ -r | grep -1 "stage"RuntalskioAccept allAck nauth no lNAtCode# AdaptiveASVw11$00WW Wndsurf Teamns 113:1 UTF-8 P 4 spaco-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89179
|
3034
|
34
|
2026-05-28T17:57:12.711023+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991032711_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
HomeDMsActivityFilesLater..•More+Slack> 0(ah]Fi HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:57:128 10Untitled +...
|
NULL
|
-1998412459397058641
|
NULL
|
click
|
ocr
|
NULL
|
HomeDMsActivityFilesLater..•More+Slack> 0(ah]Fi HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:57:128 10Untitled +...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89178
|
3034
|
33
|
2026-05-28T17:56:53.868377+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991013868_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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":"ServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'ServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ServiceTest'","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}]...
|
-1365964065509732424
|
-8708606759306818624
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:56:53®8 10Untitled +...
|
89176
|
NULL
|
NULL
|
NULL
|
|
89177
|
3035
|
40
|
2026-05-28T17:56:53.452361+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991013452_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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":"12","depth":4,"bounds":{"left":0.42519948,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.4368351,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.44780585,"top":0.17318435,"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.45511967,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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.4637633,"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.47240692,"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.48337767,"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.49202126,"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.5006649,"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.51163566,"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.5226064,"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.54920214,"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.56017286,"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.70146275,"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":"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":"31","depth":4,"bounds":{"left":0.6605718,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.6722075,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"31","depth":4,"bounds":{"left":0.6821808,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.6938165,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"113","depth":4,"bounds":{"left":0.7037899,"top":0.123703115,"width":0.011303191,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.71675533,"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.7240692,"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 team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","depth":4,"on_screen":true,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","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","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":"Configuration","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Console","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Commands","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activities, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Analytics, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Calendars, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Crm, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dev, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dialers, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DTOs, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Elasticsearch, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EngagementStats, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GeckoExport, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Livestream, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Mailboxes, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Migrate, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemes, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playbooks, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playlists, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Postmark, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProphetAi, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Reports, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Slack, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Teams, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Tracks, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Transcription, folder","depth":10,"on_screen":false,"role_description":"text"}]...
|
1334187259635969830
|
2146598106808366701
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
89175
|
NULL
|
NULL
|
NULL
|
|
89176
|
3034
|
32
|
2026-05-28T17:56:52.850990+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991012850_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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":"ServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'ServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ServiceTest'","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":"12","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6100184928929385475
|
-6928176033883448732
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89175
|
3035
|
39
|
2026-05-28T17:56:52.749446+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991012749_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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":"12","depth":4,"bounds":{"left":0.42519948,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.4368351,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.44780585,"top":0.17318435,"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.45511967,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6100184928929385475
|
-6928176033883448732
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89174
|
3034
|
31
|
2026-05-28T17:56:50.524891+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991010524_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
HomeDMsActivityFilesLater..•More+Slack> 0(ah]Fi HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:56:508 10Untitled +...
|
NULL
|
-3224329702302182326
|
NULL
|
click
|
ocr
|
NULL
|
HomeDMsActivityFilesLater..•More+Slack> 0(ah]Fi HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:56:508 10Untitled +...
|
89173
|
NULL
|
NULL
|
NULL
|
|
89173
|
3034
|
30
|
2026-05-28T17:56:49.386566+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991009386_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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":"ServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'ServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ServiceTest'","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}]...
|
5582423643801155883
|
-8994321436789994556
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:56:498 10Untitled +...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89172
|
3035
|
38
|
2026-05-28T17:56:49.491093+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991009491_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
[{"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":"#12121 on JY-20963-fix-import-on-deleted-entity, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.11569149,"height":0.025538707},"on_screen":true,"help_text":"Pull request #12121 exists for current branch JY-20963-fix-import-on-deleted-entity, but pull request details loading failed","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.85638297,"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":"ServiceTest","depth":6,"bounds":{"left":0.87167555,"top":0.019952115,"width":0.043882977,"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 'ServiceTest'","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 'ServiceTest'","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":"12","depth":4,"bounds":{"left":0.42519948,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.4368351,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.44780585,"top":0.17318435,"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.45511967,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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.4637633,"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.47240692,"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.48337767,"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.49202126,"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.5006649,"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.51163566,"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.5226064,"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.54920214,"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.56017286,"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.70146275,"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":"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":"31","depth":4,"bounds":{"left":0.6605718,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.6722075,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"31","depth":4,"bounds":{"left":0.6821808,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.6938165,"top":0.123703115,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"113","depth":4,"bounds":{"left":0.7037899,"top":0.123703115,"width":0.011303191,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.71675533,"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.7240692,"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 team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","depth":4,"on_screen":true,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';\n\nselect * from activities where id = 58081273;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\n\nSELECT * FROM users WHERE name LIKE '%Neil Hoyle%'; # 17651\nSELECT * FROM social_accounts WHERE sociable_id = 17651;\n\nSELECT * FROM activities WHERE uuid_to_bin('975c6830-7d49-4c1e-b2e9-ac80c10a738a') = uuid;\nSELECT * FROM opportunities WHERE id IN (7842553, 6211727);\nSELECT * FROM contacts WHERE id IN (10202724, 6211727);\nSELECT * FROM opportunity_stages WHERE opportunity_id = 7842553;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 519 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 436;\nselect * from crm_profiles where crm_configuration_id = 436; # 76091797 -> 16612\n\nselect * from contact_roles where contact_id = 10202724;\n\nselect * from stages where team_id = 519; # 18778\n18775\n\nSELECT\n id,\n crm_provider_id,\n stage_id,\n is_closed,\n is_won,\n stage_updated_at,\n updated_at\nFROM opportunities\nWHERE id IN (6211727, 7842553);\n\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id = 6211727 AND contact_id = 10202724;\n\nSELECT id, name, stage_id, is_closed, is_won, updated_at, remotely_created_at\nFROM opportunities\nWHERE account_id = 8179134\nORDER BY updated_at DESC;\n\n\nselect * from text_relays where created_at > '2026-01-01';\nAND id IN (691, 692);\n\nselect * from teams;\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nSELECT DISTINCT u.id, u.email, u.name, u.team_id, t.name as team_name,\n t.twilio_sms_sid, t.twilio_messaging_sid\nFROM users u\nINNER JOIN teams t ON u.team_id = t.id\nWHERE (t.twilio_sms_sid IS NOT NULL OR t.twilio_messaging_sid IS NOT NULL)\nAND u.status = 1\nORDER BY t.name, u.email;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 187 and sa.provider = 'salesforce';\n\nselect * from activities where id = 31264367;\nselect * from contacts where id = 6331639;\nselect * from accounts where id = 4156632;\nselect * from opportunities where id = 4843610;\n# update `activities` set `account_id` = 4156632, `contact_id` = 6331639, `opportunity_id` = 4843610,\n# `stage_id` = 13273, `activities`.`updated_at` = 2026-05-22 07:16:17 where `id` = 31264367)\"\n\nselect * from text_relays where created_at > '2026-05-01';\n\nselect * from activities order by id desc;\n\nselect * from users where name like '%Subra%';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('04a9cfad-2c87-4453-9e72-20aeb78ccf8d') = uuid;\nselect * from teams where id = 555;\nselect * from stages where team_id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 100 and sa.provider = 'hubspot';\n\nselect id, is_closed, is_won, stage_updated_at, crm_provider_id, stage_id, probability,\nclose_date, forecast_category, deleted_at, created_at, remotely_created_at, updated_at\nfrom opportunities where team_id = 555 and stage_id = 20616 order by updated_at desc limit 10;\n\nselect id, crm_provider_id, name, probability, updated_at, deleted_at\nfrom stages\nwhere id = 20616;\n\nSELECT id, crm_provider_id, probability, deleted_at, updated_at\nFROM stages\nWHERE crm_provider_id = 'closedlost';\n\nSELECT id, crm_provider_id, is_won, is_closed, stage_updated_at, updated_at,\n (stage_updated_at = updated_at) as stage_was_reason_for_update\nFROM opportunities\nWHERE team_id = 555 AND stage_id = 20616 AND is_won = 0 AND deleted_at IS NULL\nORDER BY updated_at DESC;\n\nSELECT o.id, o.crm_provider_id, o.is_won, o.is_closed, o.stage_id,\n s.crm_provider_id AS stage_crm_provider_id, s.probability,\n o.stage_updated_at, o.updated_at, o.created_at, o.remotely_created_at,\n o.team_id\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n# WHERE o.team_id = 416\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\nORDER BY o.updated_at DESC;\n\nselect * from stages where team_id = 416;\n# 14267, 14269, 14283, 14293, 14294, 14296\n\nselect * from opportunities where id = 7989974;\nselect * from stages where id = 14269;\n\nSELECT id, crm_provider_id, name, probability, created_at, updated_at\nFROM stages\nWHERE id = 14269;\n\nSELECT COUNT(*)\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL\n AND o.created_at > '2025-10-13';\n\nSELECT\n SUM(CASE WHEN o.updated_at < '2025-10-13' THEN 1 ELSE 0 END) as before_fix,\n SUM(CASE WHEN o.updated_at >= '2025-10-13' THEN 1 ELSE 0 END) as after_fix,\n COUNT(*) as total\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nJOIN crm_configurations cc ON cc.id = s.crm_configuration_id\nWHERE cc.provider = 'hubspot'\n AND s.probability = 100\n AND o.is_won = 0\n AND o.deleted_at IS NULL\n AND s.deleted_at IS NULL;\n\nSELECT o.id, o.is_won, o.probability as opp_probability,\n s.probability as stage_prob, s.crm_provider_id,\n o.created_at\nFROM opportunities o\nJOIN stages s ON s.id = o.stage_id\nWHERE o.team_id = 416 AND o.created_at > '2026-05-28' AND s.probability = 100\nORDER BY o.created_at DESC LIMIT 10;","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","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":"Configuration","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Console","depth":8,"on_screen":false,"role_description":"text"}]...
|
1334187259635969830
|
2146598106808366701
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12121 on JY-20963-fix-im Project: faVsco.js, menu
#12121 on JY-20963-fix-import-on-deleted-entity, menu
Start Listening for PHP Debug Connections
ServiceTest
Run 'ServiceTest'
Debug 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
12
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId)
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
31
9
31
3
113
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = ...
|
89171
|
NULL
|
NULL
|
NULL
|
|
89171
|
3035
|
37
|
2026-05-28T17:56:46.154575+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991006154_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormEV faVsco,ls ~ProjectvViewNeweNNCCooc#1212 PhpStormEV faVsco,ls ~ProjectvViewNeweNNCCooc#12121 on JY-20963-fx-ImKetucioWindow© ServiceTest.php© HubspotAppUninstalLJob.fimportaccountostonto© ImportBatchJobTrait.phpemoorcontcororon©ImportOpportunityBatch.pMmacuryochyict.on© CachedCrmServiceDecorator.php© DeleteObjects Trait.phpuorcoaiuocrd.pntRecordSelector.phphuososwo.noocea.cokecontoensynstooo.m© PayloadBulider.phpImportBatchJcbTrait.php© ProcessinternalWethookEcrmantityRepos.tory.phprart noortbarch.obtrayprotected functzon processimportsatchtE SalesforceC Autolon Delavedtocrm oho© CheckAndRetryRemoteMatchCereateFollowuosctmty oho(C)ereateNotes onoCMatchactvitiesToNewdooor 114© MatchActivityCrmData.phpE Noteeoiectono© SaveActivity.php116117© SaveTranscription.php© SetupLayout.php©SyncActivity.php© SyncFieidMetadata.php© SyncHubspotObjects.phpE B© SyncLeads.php© SyncObjects.php122124© SyncOpportunities.Job.php© SyncOpportunity.php126© SyncProfileMetadata.phpe GunaTosmSiahe lah nhoLog: : info( message: Sthis->getLogPrefix() . ' Processing batch', ["scnConfigurationid' => Sthis->crnConfigurationid,"batchSize' => count(Sthis->crnids),1):SfilteredIds = $this->filterExisting0bjects(ScraConfig, $crnEntityRepository);if Cenpty(SfilteredIds)) €Log:: info( message: Sthis->getLogPrefix() . * No existing objects found in Liniony, skipping batch',"scaCenfigucationld' = Sthis-scraConfigurationId,eeuosoeroun s coontottncosD):SstartTine = microtime(as.float true):Sresult = sthis-smoor.BarchlScrnSeryicer stterediids)"Services+, o,cv Moatabasd@ Outpurt10 rowsDidy799900419988851jiminny.opportunitiesiid fiminny stageE Result: 34Result 47xgis_won Yopp_probability Ystage_prob Y4 console 2 s 845 msell users 1 s 548 ms#liminny@localhostAHS JocalA SOV A PRODA consoleV A STAGING& consoleDocker "TH:100100180100100crn_provider_1d Y168.60 29848944100.00 208480441108.00 208480441188.80.298488641100100.00 208488441108.00 208480441108.00 208488441e MrsreSMCASSWNoTANDeoAw.edanswiulcomolatar.l.minutas.aooE customlogE Iaravellog4 SF [iminny@localhost)4 console (EU) xE users (EU)A console (STAGING)ihee AncdytE cc.provider = "hubspot"ID s-probability = 1001D 0.is_won = 0iu o.delered ac as nuLulu s.delered ar as nuLuID o.created_at > *2025-10-13' :A HS.Jocal (jiminny@localhost)A console (PROD]68 Jiminny~031 49 A31 X3 X113 AECTSUMCCASE WHEN O.updated_at < *2825-18-13 THEN 1 ELSE 0 END) as before_fix,SUMCCASE WHEN O.updated_at >= *2825-10-13* THEN 1 ELSE 0 END) as after_fix,COUNT(*) as totalonnartunttes1 stages s 1.n<->1: ON s.id = o.stage_idcrm_configurations cc .nc->l: ON cc.1d = s.crm_configuration_1dIE cc.provider = "hubspot"sunnohabtiuty taal1D o.is_won = 0Unondeleted at is MullID s.deleted_at IS NULL;ECT o.1d, o.is_won, O.probability as opp_probability,1812o.created_attopportunities o1 stages s 1.n<-›1: ON s.id = o.stage_idtE o.tean,id = 416 AND o.created_at > *2026-85-28' AND S.probability = 100ER BY O.created_at DESC LIMIT 10;created_at Y2826-05-28 17:48:162826-05-28 17:48:162826-05-28 17:43:272826-05-28 17:23:172004-A6-20 14-10-002926-05-28 16:49:692026-05-28 16:38:322826-85-28 16:38:31DankrACDe 1X2.2TO0У L7Inu co moy k0ioo.eU ServiceTest ~CascadeeworehsermiehTlasorce DaleionkOtwooeoo0ntur+0.The only remaining explanation: getClosedDealStages () is not returning *21843841* in wonfl . Let me check getOpportumwcloscos ooes aoin- soeciowhetnerneresa cocontourrmmmSberein('probability', (0.0e, 108.001) - stage has probability • 188 (integer). This should match 108.00 . But wait -probability column is cast as integer in the Stage model. Let me check wnat MysoL actually stores and whether there's afloat precision issue... no, 180 == 100.00 in MySQL regardless.The real question is: does Sthis->config-»stages() for team 416's config (id=331) actually return stage 14269?Siote 1ezo3 nos cre contguration zd m 35% v. oux contiguracion os cenesi) ls bas anylsceneiiclass, 'cre conttouratM") Sonqueres WHERE em. contfouration1d u 331, Stace 14269 has that Should workUnless - Sthis->config in the service instance is NOT configuration 331. Let me check how the service is instantiated forthe batch job:Now I see something critical on line 114-123:ImportbatchJobtrait.php:114-12Stalteredlos = Sthis-iilterexistingobiects Scracontza, ScrecntzcyRepositony=1f (empty(sfilteredids)) €Loa:: intosthis-soetiooPrerxo No existing cbfects toundsinoinny, skiooina batchieroatdaurar.onidtCthiceser.contacuratool1 fle +2 >Ask anything (atoL)Accept all• • code)# Adaptive• OCSV~WW Windsurf Teams 114.1 (390 chars, 9 line breaks) UTF-8 A 4 spaco-...
|
NULL
|
-2297563015201661718
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormEV faVsco,ls ~ProjectvViewNeweNNCCooc#1212 PhpStormEV faVsco,ls ~ProjectvViewNeweNNCCooc#12121 on JY-20963-fx-ImKetucioWindow© ServiceTest.php© HubspotAppUninstalLJob.fimportaccountostonto© ImportBatchJobTrait.phpemoorcontcororon©ImportOpportunityBatch.pMmacuryochyict.on© CachedCrmServiceDecorator.php© DeleteObjects Trait.phpuorcoaiuocrd.pntRecordSelector.phphuososwo.noocea.cokecontoensynstooo.m© PayloadBulider.phpImportBatchJcbTrait.php© ProcessinternalWethookEcrmantityRepos.tory.phprart noortbarch.obtrayprotected functzon processimportsatchtE SalesforceC Autolon Delavedtocrm oho© CheckAndRetryRemoteMatchCereateFollowuosctmty oho(C)ereateNotes onoCMatchactvitiesToNewdooor 114© MatchActivityCrmData.phpE Noteeoiectono© SaveActivity.php116117© SaveTranscription.php© SetupLayout.php©SyncActivity.php© SyncFieidMetadata.php© SyncHubspotObjects.phpE B© SyncLeads.php© SyncObjects.php122124© SyncOpportunities.Job.php© SyncOpportunity.php126© SyncProfileMetadata.phpe GunaTosmSiahe lah nhoLog: : info( message: Sthis->getLogPrefix() . ' Processing batch', ["scnConfigurationid' => Sthis->crnConfigurationid,"batchSize' => count(Sthis->crnids),1):SfilteredIds = $this->filterExisting0bjects(ScraConfig, $crnEntityRepository);if Cenpty(SfilteredIds)) €Log:: info( message: Sthis->getLogPrefix() . * No existing objects found in Liniony, skipping batch',"scaCenfigucationld' = Sthis-scraConfigurationId,eeuosoeroun s coontottncosD):SstartTine = microtime(as.float true):Sresult = sthis-smoor.BarchlScrnSeryicer stterediids)"Services+, o,cv Moatabasd@ Outpurt10 rowsDidy799900419988851jiminny.opportunitiesiid fiminny stageE Result: 34Result 47xgis_won Yopp_probability Ystage_prob Y4 console 2 s 845 msell users 1 s 548 ms#liminny@localhostAHS JocalA SOV A PRODA consoleV A STAGING& consoleDocker "TH:100100180100100crn_provider_1d Y168.60 29848944100.00 208480441108.00 208480441188.80.298488641100100.00 208488441108.00 208480441108.00 208488441e MrsreSMCASSWNoTANDeoAw.edanswiulcomolatar.l.minutas.aooE customlogE Iaravellog4 SF [iminny@localhost)4 console (EU) xE users (EU)A console (STAGING)ihee AncdytE cc.provider = "hubspot"ID s-probability = 1001D 0.is_won = 0iu o.delered ac as nuLulu s.delered ar as nuLuID o.created_at > *2025-10-13' :A HS.Jocal (jiminny@localhost)A console (PROD]68 Jiminny~031 49 A31 X3 X113 AECTSUMCCASE WHEN O.updated_at < *2825-18-13 THEN 1 ELSE 0 END) as before_fix,SUMCCASE WHEN O.updated_at >= *2825-10-13* THEN 1 ELSE 0 END) as after_fix,COUNT(*) as totalonnartunttes1 stages s 1.n<->1: ON s.id = o.stage_idcrm_configurations cc .nc->l: ON cc.1d = s.crm_configuration_1dIE cc.provider = "hubspot"sunnohabtiuty taal1D o.is_won = 0Unondeleted at is MullID s.deleted_at IS NULL;ECT o.1d, o.is_won, O.probability as opp_probability,1812o.created_attopportunities o1 stages s 1.n<-›1: ON s.id = o.stage_idtE o.tean,id = 416 AND o.created_at > *2026-85-28' AND S.probability = 100ER BY O.created_at DESC LIMIT 10;created_at Y2826-05-28 17:48:162826-05-28 17:48:162826-05-28 17:43:272826-05-28 17:23:172004-A6-20 14-10-002926-05-28 16:49:692026-05-28 16:38:322826-85-28 16:38:31DankrACDe 1X2.2TO0У L7Inu co moy k0ioo.eU ServiceTest ~CascadeeworehsermiehTlasorce DaleionkOtwooeoo0ntur+0.The only remaining explanation: getClosedDealStages () is not returning *21843841* in wonfl . Let me check getOpportumwcloscos ooes aoin- soeciowhetnerneresa cocontourrmmmSberein('probability', (0.0e, 108.001) - stage has probability • 188 (integer). This should match 108.00 . But wait -probability column is cast as integer in the Stage model. Let me check wnat MysoL actually stores and whether there's afloat precision issue... no, 180 == 100.00 in MySQL regardless.The real question is: does Sthis->config-»stages() for team 416's config (id=331) actually return stage 14269?Siote 1ezo3 nos cre contguration zd m 35% v. oux contiguracion os cenesi) ls bas anylsceneiiclass, 'cre conttouratM") Sonqueres WHERE em. contfouration1d u 331, Stace 14269 has that Should workUnless - Sthis->config in the service instance is NOT configuration 331. Let me check how the service is instantiated forthe batch job:Now I see something critical on line 114-123:ImportbatchJobtrait.php:114-12Stalteredlos = Sthis-iilterexistingobiects Scracontza, ScrecntzcyRepositony=1f (empty(sfilteredids)) €Loa:: intosthis-soetiooPrerxo No existing cbfects toundsinoinny, skiooina batchieroatdaurar.onidtCthiceser.contacuratool1 fle +2 >Ask anything (atoL)Accept all• • code)# Adaptive• OCSV~WW Windsurf Teams 114.1 (390 chars, 9 line breaks) UTF-8 A 4 spaco-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
89170
|
3034
|
29
|
2026-05-28T17:56:46.257980+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779991006257_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
HomeDMsActivityFilesLater..•More+Slack> 0(ah]Fi HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:56:45®8 10Untitled +...
|
NULL
|
-1162588991110935540
|
NULL
|
click
|
ocr
|
NULL
|
HomeDMsActivityFilesLater..•More+Slack> 0(ah]Fi HomeDMsActivityFilesLater..•More+Slack> 0(ah]FileEditViewGoHistoryJiminny ...* Starredplatform-backend-...platform-inner-teamChannels# ai-chapter# alerts# backend# bugs# confusion-clinic# donut_time# engineering# general# happy_birthday& infosec_internal_all# infra-changes# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...WindowHelpSearch: in:#platform-inner-teamX*à platform-inner-teamMessagesBookmarks0 Channel Overview7 RefinementsO Files< PinsP Retro Action ItemsChanges:Monday, May 4th ~• Do not requeue duplicatesjiminny/app May 4th Added by GitHubNikolay Ivanov 1:48 PMhttps://github.com/jiminny/app/pull/12041, фикс за импорта на стейджове (само при hubspot се оказа )но има още една грешка за тях, слагаме стейджове от една организация на другаи не мога да намеря никьде в кода защона еи има две организации които не могат да се изтрият заради товаVasil Vasilev 2:07 PMимаше проблем със мачването на стейджове от една организация на другазаради кеширане на pipelineldпреди горе долу 10тина дена го гледахмеNikolay Ivanov 2:07 PMтой още го иматози пьт при stageвиж ми PRVasil Vasilev 2:08 PMpipelineld бeшe default за едно 5-6 организации, и там се омазваше кешапонеже няма нито crm coniguration id, нито team id включено в кеша дето заминава в РЕДИСа, да, това е сьщотодобре де, аз защо си мисля, че фикс за тоя проблем вече замина на продNikolay Ivanov 2:10 PMMessage & platform-inner-team+100% <78 • Thu 28 May 20:56:45®8 10Untitled +...
|
89167
|
NULL
|
NULL
|
NULL
|
|
6280
|
259
|
14
|
2026-05-07T18:08:21.354250+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778177301354_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new HandleHubspotRateLimit(),
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
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":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\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":"8","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.019444445,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.025555555},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.014583333,"height":0.025555555},"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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new HandleHubspotRateLimit(),\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new HandleHubspotRateLimit(),\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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,"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}]...
|
5361908168246198672
|
-2316487825022153100
|
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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new HandleHubspotRateLimit(),
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
6277
|
NULL
|
NULL
|
NULL
|
|
6279
|
260
|
13
|
2026-05-07T18:08:21.258805+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778177301258_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new HandleHubspotRateLimit(),
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
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.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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\n }\n }\n}","depth":4,"bounds":{"left":0.4401596,"top":0.06624102,"width":0.31615692,"height":0.91300875},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\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.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,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00930851,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.006981383,"height":0.0},"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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new HandleHubspotRateLimit(),\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new HandleHubspotRateLimit(),\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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}]...
|
6462005968516272421
|
-2316487825022153100
|
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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new HandleHubspotRateLimit(),
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
6278
|
260
|
12
|
2026-05-07T18:08:15.056161+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778177295056_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}...
|
[{"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\n }\n }\n}","depth":4,"bounds":{"left":0.4401596,"top":0.06624102,"width":0.31615692,"height":0.91300875},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6322393822977483
|
-2563669779787567664
|
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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}...
|
6275
|
NULL
|
NULL
|
NULL
|
|
6277
|
259
|
13
|
2026-05-07T18:08:15.056183+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778177295056_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new HandleHubspotRateLimit(),
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project...
|
[{"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<br/>Some incoming commits are not fetched<br/>","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":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\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":"8","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.019444445,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.025555555},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.014583333,"height":0.025555555},"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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new HandleHubspotRateLimit(),\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n new HandleHubspotRateLimit(),\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-4754276558096160799
|
-2316487825022153100
|
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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
new HandleHubspotRateLimit(),
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
6061
|
244
|
8
|
2026-05-07T17:25:47.518570+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778174747518_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","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":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\n }\n }\n}","depth":4,"bounds":{"left":0.4401596,"top":0.06624102,"width":0.31615692,"height":0.91300875},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\Utility\\Service;\n\nuse Illuminate\\Cache\\RateLimiter;\nuse Jiminny\\Contracts\\Http\\RateLimited;\nuse Jiminny\\Contracts\\Http\\RateLimitInterface;\n\nclass ProviderRateLimiter\n{\n protected RateLimiter $rateLimiter;\n\n public function __construct(RateLimiter $rateLimiter)\n {\n $this->rateLimiter = $rateLimiter;\n }\n\n public function canMakeRequest(RateLimited $provider): bool\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $key = $rateLimit->getKey();\n\n if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {\n return false;\n }\n }\n\n return true;\n }\n\n public function requestAvailableIn(RateLimited $provider): int\n {\n return $provider->getRateLimits()->isNotEmpty()\n ? $provider->getRateLimits()\n ->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))\n ->max()\n : 0\n ;\n }\n\n public function incrementRequestCount(RateLimited $provider): void\n {\n /** @var RateLimitInterface $rateLimit */\n foreach ($provider->getRateLimits() as $rateLimit) {\n $this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());\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.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,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00930851,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.006981383,"height":0.0},"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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"bounds":{"left":0.122340426,"top":0.22106944,"width":0.32646278,"height":0.77893054},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"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}]...
|
-5122861347382604164
|
-2316487816432218508
|
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
<?php
declare(strict_types=1);
namespace Jiminny\Component\Utility\Service;
use Illuminate\Cache\RateLimiter;
use Jiminny\Contracts\Http\RateLimited;
use Jiminny\Contracts\Http\RateLimitInterface;
class ProviderRateLimiter
{
protected RateLimiter $rateLimiter;
public function __construct(RateLimiter $rateLimiter)
{
$this->rateLimiter = $rateLimiter;
}
public function canMakeRequest(RateLimited $provider): bool
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$key = $rateLimit->getKey();
if ($this->rateLimiter->tooManyAttempts($key, $rateLimit->getQuota())) {
return false;
}
}
return true;
}
public function requestAvailableIn(RateLimited $provider): int
{
return $provider->getRateLimits()->isNotEmpty()
? $provider->getRateLimits()
->map(fn (RateLimitInterface $rateLimit): int => $this->rateLimiter->availableIn($rateLimit->getKey()))
->max()
: 0
;
}
public function incrementRequestCount(RateLimited $provider): void
{
/** @var RateLimitInterface $rateLimit */
foreach ($provider->getRateLimits() as $rateLimit) {
$this->rateLimiter->hit($rateLimit->getKey(), $rateLimit->getWindow());
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
2781
|
114
|
6
|
2026-05-07T11:39:58.663090+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778153998663_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Jiminny\Component\Queue\Constants;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Job;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Imports a batch of HubSpot deals (opportunities) by their CRM IDs.
*
* Uses webhook batch sync mechanism to efficiently process property change and association
* change events. Deals are collected in Redis sets and processed in batches of 100.
*
* See ImportBatchJobTrait for detailed failure handling documentation.
*/
class ImportOpportunityBatch extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
use ImportBatchJobTrait;
public int $tries = 3;
public int $timeout = 300;
public array $backoff = [30, 120];
public function __construct(int $crmConfigurationId, array $crmIds)
{
$this->crmConfigurationId = $crmConfigurationId;
$this->crmIds = $crmIds;
$this->onQueue(Constants::QUEUE_CRM_SYNC);
}
public function handle(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$this->processImportBatch($resolveTeamCrmConnection, $crmConfigurationRepository, $crmEntityRepository);
}
public function failed(\Throwable $exception): void
{
$this->requeueFailedBatch($exception);
}
protected function getObjectType(): string
{
return self::OBJECT_TYPE_DEAL;
}
protected function getLogPrefix(): string
{
return '[ImportOpportunityBatch]';
}
protected function importBatch(HubspotInterface $crmService, array $crmIds): array
{
return $crmService->importOpportunityBatchByIds($crmIds);
}
}...
|
[{"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":"AXTextArea","text":"Editor for custom.log","depth":4,"bounds":{"left":0.5475399,"top":0.0726257,"width":0.44082448,"height":0.9066241},"on_screen":true,"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":"1","depth":4,"bounds":{"left":0.5049867,"top":0.17478053,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.51396275,"top":0.17318435,"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.5212766,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Jiminny\\Component\\Queue\\Constants;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Imports a batch of HubSpot deals (opportunities) by their CRM IDs.\n *\n * Uses webhook batch sync mechanism to efficiently process property change and association\n * change events. Deals are collected in Redis sets and processed in batches of 100.\n *\n * See ImportBatchJobTrait for detailed failure handling documentation.\n */\nclass ImportOpportunityBatch extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n use ImportBatchJobTrait;\n\n public int $tries = 3;\n public int $timeout = 300;\n public array $backoff = [30, 120];\n\n public function __construct(int $crmConfigurationId, array $crmIds)\n {\n $this->crmConfigurationId = $crmConfigurationId;\n $this->crmIds = $crmIds;\n\n $this->onQueue(Constants::QUEUE_CRM_SYNC);\n }\n\n public function handle(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $this->processImportBatch($resolveTeamCrmConnection, $crmConfigurationRepository, $crmEntityRepository);\n }\n\n public function failed(\\Throwable $exception): void\n {\n $this->requeueFailedBatch($exception);\n }\n\n protected function getObjectType(): string\n {\n return self::OBJECT_TYPE_DEAL;\n }\n\n protected function getLogPrefix(): string\n {\n return '[ImportOpportunityBatch]';\n }\n\n protected function importBatch(HubspotInterface $crmService, array $crmIds): array\n {\n return $crmService->importOpportunityBatchByIds($crmIds);\n }\n}","depth":4,"bounds":{"left":0.11968085,"top":0.083798885,"width":0.4085771,"height":0.9162011},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Jiminny\\Component\\Queue\\Constants;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Imports a batch of HubSpot deals (opportunities) by their CRM IDs.\n *\n * Uses webhook batch sync mechanism to efficiently process property change and association\n * change events. Deals are collected in Redis sets and processed in batches of 100.\n *\n * See ImportBatchJobTrait for detailed failure handling documentation.\n */\nclass ImportOpportunityBatch extends Job implements ShouldQueue\n{\n use InteractsWithQueue;\n use SerializesModels;\n use ImportBatchJobTrait;\n\n public int $tries = 3;\n public int $timeout = 300;\n public array $backoff = [30, 120];\n\n public function __construct(int $crmConfigurationId, array $crmIds)\n {\n $this->crmConfigurationId = $crmConfigurationId;\n $this->crmIds = $crmIds;\n\n $this->onQueue(Constants::QUEUE_CRM_SYNC);\n }\n\n public function handle(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $this->processImportBatch($resolveTeamCrmConnection, $crmConfigurationRepository, $crmEntityRepository);\n }\n\n public function failed(\\Throwable $exception): void\n {\n $this->requeueFailedBatch($exception);\n }\n\n protected function getObjectType(): string\n {\n return self::OBJECT_TYPE_DEAL;\n }\n\n protected function getLogPrefix(): string\n {\n return '[ImportOpportunityBatch]';\n }\n\n protected function importBatch(HubspotInterface $crmService, array $crmIds): array\n {\n return $crmService->importOpportunityBatchByIds($crmIds);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false}]...
|
3860792425122002198
|
-6033638249317987452
|
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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Jiminny\Component\Queue\Constants;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Jobs\Job;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Imports a batch of HubSpot deals (opportunities) by their CRM IDs.
*
* Uses webhook batch sync mechanism to efficiently process property change and association
* change events. Deals are collected in Redis sets and processed in batches of 100.
*
* See ImportBatchJobTrait for detailed failure handling documentation.
*/
class ImportOpportunityBatch extends Job implements ShouldQueue
{
use InteractsWithQueue;
use SerializesModels;
use ImportBatchJobTrait;
public int $tries = 3;
public int $timeout = 300;
public array $backoff = [30, 120];
public function __construct(int $crmConfigurationId, array $crmIds)
{
$this->crmConfigurationId = $crmConfigurationId;
$this->crmIds = $crmIds;
$this->onQueue(Constants::QUEUE_CRM_SYNC);
}
public function handle(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$this->processImportBatch($resolveTeamCrmConnection, $crmConfigurationRepository, $crmEntityRepository);
}
public function failed(\Throwable $exception): void
{
$this->requeueFailedBatch($exception);
}
protected function getObjectType(): string
{
return self::OBJECT_TYPE_DEAL;
}
protected function getLogPrefix(): string
{
return '[ImportOpportunityBatch]';
}
protected function importBatch(HubspotInterface $crmService, array $crmIds): array
{
return $crmService->importOpportunityBatchByIds($crmIds);
}
}...
|
2779
|
NULL
|
NULL
|
NULL
|
|
2779
|
114
|
5
|
2026-05-07T11:39:54.270350+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778153994270_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"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":"AXTextArea","text":"Editor for custom.log","depth":4,"bounds":{"left":0.5475399,"top":0.0726257,"width":0.44082448,"height":0.9066241},"on_screen":true,"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":"8","depth":4,"bounds":{"left":0.49301863,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.50299203,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.51396275,"top":0.17318435,"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.5212766,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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}]...
|
-9116697243771171146
|
-4622333024668710300
|
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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
2778
|
113
|
5
|
2026-05-07T11:39:54.270351+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778153994270_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
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":"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":"AXTextArea","text":"Editor for custom.log","depth":4,"on_screen":true,"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":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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,"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}]...
|
-9116697243771171146
|
-4622333024668710300
|
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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
2777
|
NULL
|
NULL
|
NULL
|
|
2777
|
113
|
4
|
2026-05-07T11:39:49.459300+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778153989459_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
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, folder
Component, folder
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything, folder
Dtos, folder
Events, folder
AskAnythingPromptService.php
HistoryService.php
AskJiminnyAi, folder
AWS, folder
BillingManagement, folder
Cache, folder
CoachingFeedback, folder
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks, folder
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
Notification, folder
Nudge, folder
ParagraphBreaker, folder
ParticipantSpeech, folder
PartitionedCookie, folder
PlaybackPage, folder
Playlist, folder
Prophet, folder
ProphetAi, folder
ProsperWorks, folder
Queue, folder
Job, folder
RateLimitAware.php, abstract class
RateLimitAwareWrapper.php, class
BotsQueueConstants.php
Constants.php
ProcessingQueueConstants.php
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
Twilio, folder
Uploader, folder
UrlGenerator, folder
Utility, folder
Exceptions, folder
Service, folder
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid, folder
Waveform, folder
Webhooks, folder
Workflow, folder
Configuration, folder
Console, folder
Commands, folder
Activities, folder
Analytics, folder
Calendars, folder
Crm, folder
Hubspot, folder
IntegrationApp, folder
Traits, folder
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...
|
[{"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":"AXTextArea","text":"Editor for custom.log","depth":4,"on_screen":true,"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":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","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\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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,"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":false,"role_description":"text"},{"role":"AXStaticText","text":".vscode, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".windsurf, folder","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, folder","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Component, folder","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Acl, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch, folder","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, folder","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","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AWS, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Cache, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback, folder","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, folder","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, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParagraphBreaker, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantSpeech, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PartitionedCookie, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPage, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playlist, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Prophet, folder","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, 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":"Job, folder","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, 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"},{"role":"AXStaticText","text":"Twilio, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Uploader, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UrlGenerator, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Utility, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Exceptions, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Service, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Waveform, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Webhooks, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Workflow, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Configuration, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activities, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Analytics, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Calendars, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Crm, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Hubspot, folder","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IntegrationApp, folder","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Traits, folder","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"}]...
|
-967357858300030979
|
2301953601369594468
|
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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
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, folder
Component, folder
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything, folder
Dtos, folder
Events, folder
AskAnythingPromptService.php
HistoryService.php
AskJiminnyAi, folder
AWS, folder
BillingManagement, folder
Cache, folder
CoachingFeedback, folder
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks, folder
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
Notification, folder
Nudge, folder
ParagraphBreaker, folder
ParticipantSpeech, folder
PartitionedCookie, folder
PlaybackPage, folder
Playlist, folder
Prophet, folder
ProphetAi, folder
ProsperWorks, folder
Queue, folder
Job, folder
RateLimitAware.php, abstract class
RateLimitAwareWrapper.php, class
BotsQueueConstants.php
Constants.php
ProcessingQueueConstants.php
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
Twilio, folder
Uploader, folder
UrlGenerator, folder
Utility, folder
Exceptions, folder
Service, folder
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid, folder
Waveform, folder
Webhooks, folder
Workflow, folder
Configuration, folder
Console, folder
Commands, folder
Activities, folder
Analytics, folder
Calendars, folder
Crm, folder
Hubspot, folder
IntegrationApp, folder
Traits, folder
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...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
2776
|
114
|
4
|
2026-05-07T11:39:49.353007+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778153989353_m2.jpg...
|
PhpStorm
|
faVsco.js – ImportBatchJobTrait.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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
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, folder
Component, folder
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything, folder
Dtos, folder
Events, folder
AskAnythingPromptService.php
HistoryService.php
AskJiminnyAi, folder
AWS, folder
BillingManagement, folder
Cache, folder
CoachingFeedback, folder
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks, folder
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
Notification, folder
Nudge, folder
ParagraphBreaker, folder
ParticipantSpeech, folder
PartitionedCookie, folder
PlaybackPage, folder
Playlist, folder
Prophet, folder
ProphetAi, folder
ProsperWorks, folder
Queue, folder
Job, folder
RateLimitAware.php, abstract class
RateLimitAwareWrapper.php, class
BotsQueueConstants.php
Constants.php
ProcessingQueueConstants.php
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
Twilio, folder
Uploader, folder
UrlGenerator, folder
Utility, folder
Exceptions, folder
Service, folder
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid, folder
Waveform, folder
Webhooks, folder
Workflow, folder
Configuration, folder
Console, folder
Commands, folder
Activities, folder
Analytics, folder
Calendars, folder
Crm, folder
Hubspot, folder
IntegrationApp, folder
Traits, folder
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, folder
Dev, folder
AddRateLimitCommand.php, class
FixHubSpotTokens.php, class
FixMissMatchedCrmActivitiesCommand.php, final class
ImportCallsCommand.php, class
MonitorSocialAccountsState.php, class
Dialers, folder
DTOs, folder
Elasticsearch, folder
EngagementStats, folder
GeckoExport, folder
Livestream, folder
Mailboxes, folder
Migrate, folder
PlaybackThemes, folder
Playbooks, folder
Playlists, folder
Postmark, folder
ProphetAi, folder
Reports, folder
AutomatedReportsCommand.php, class
AutomatedReportsRetentionPolicyCommand.php, class
AutomatedReportsSendCommand.php, class
CreateMockAskJiminnyReportResultCommand.php, class
DeleteReportCommand.php, class
GenerateMarketingReport.php, class
Team.php, class
Usage.php, class
Slack, folder
Teams, folder
Tracks, folder
Transcription, folder
Twilio, folder
Users, folder
Vocabulary, folder...
|
[{"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":"AXTextArea","text":"Editor for custom.log","depth":4,"bounds":{"left":0.5475399,"top":0.0726257,"width":0.44082448,"height":0.9066241},"on_screen":true,"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":"8","depth":4,"bounds":{"left":0.49301863,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"bounds":{"left":0.50299203,"top":0.17478053,"width":0.00930851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.51396275,"top":0.17318435,"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.5212766,"top":0.17318435,"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\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm\\Hubspot;\n\nuse Illuminate\\Queue\\Middleware\\WithoutOverlapping;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\CrmConfigurationRepository;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\BatchSyncRedisService;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\n\n/**\n * Shared logic for HubSpot batch import jobs.\n *\n * Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)\n * with consistent error handling, logging, and failure recovery mechanisms.\n *\n * Failure Handling Strategy:\n *\n * 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):\n * - Exception propagates out of handle()\n * - Laravel retries the job up to $tries times with $backoff delays\n * - If all retries exhausted, failed() requeues ALL IDs back to Redis\n * - Next SyncObjects cycle will pick them up and retry\n *\n * 2. DATA-LEVEL FAILURES (per-object exceptions during import):\n * - Caught inside the per-object loop in import*BatchByIds() methods\n * - Indicate permanent issues: DB constraints, corrupt data, unmappable values\n * - Retrying won't fix them - logged with specific error per ID\n * - NOT requeued to avoid infinite retry loops\n * - Require manual investigation and data correction\n *\n * Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)\n * return null and are not considered failures - they simply cannot be imported until dependencies exist.\n */\ntrait ImportBatchJobTrait\n{\n private const string OBJECT_TYPE_CONTACT = 'contact';\n private const string OBJECT_TYPE_COMPANY = 'company';\n private const string OBJECT_TYPE_DEAL = 'deal';\n\n private const int LOCK_EXPIRES_AFTER_SECONDS = 360;\n private const string LOCK_KEY_PREFIX = 'crm-hubspot-import-batch:';\n\n private int $crmConfigurationId;\n private array $crmIds;\n\n abstract protected function getObjectType(): string;\n\n abstract protected function getLogPrefix(): string;\n\n abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;\n\n /**\n * Serialize HubSpot import batches per CRM configuration across all object types.\n *\n * `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,\n * ImportContactBatch and ImportAccountBatch for the same crm_configuration_id\n * contend on a single lock. This prevents concurrent imports from causing\n * gap-lock contention on the `accounts` and `contacts` unique indexes.\n *\n * Duplicates are dropped (not released back to the queue). On SQS, each release\n * increments the message's ApproximateReceiveCount, which Laravel reads as\n * $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,\n * releasing duplicates causes them to exhaust their attempt budget while waiting\n * and trip MaxAttemptsExceededException without ever running. Dropping is safe\n * here because SyncObjects rediscovers IDs on every cycle, so any IDs carried\n * by a dropped duplicate will be re-batched on the next sync.\n */\n public function middleware(): array\n {\n return [\n (new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))\n ->shared()\n ->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)\n ->dontRelease(),\n ];\n }\n\n protected function processImportBatch(\n ResolveTeamCrmConnection $resolveTeamCrmConnection,\n CrmConfigurationRepository $crmConfigurationRepository,\n CrmEntityRepository $crmEntityRepository\n ): void {\n $crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);\n if ($crmConfig === null) {\n Log::error($this->getLogPrefix() . ' CRM configuration not found', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n ]);\n\n return;\n }\n\n $crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());\n\n if (! $crmService instanceof HubspotInterface) {\n Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'serviceClass' => $crmService::class,\n ]);\n\n return;\n }\n\n Log::info($this->getLogPrefix() . ' Processing batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'batchSize' => count($this->crmIds),\n ]);\n\n $filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);\n\n if (empty($filteredIds)) {\n Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requestedCount' => count($this->crmIds),\n ]);\n\n return;\n }\n\n $startTime = microtime(true);\n\n $result = $this->importBatch($crmService, $filteredIds);\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n\n $successCount = $result['success_count'] ?? \\count($result['success'] ?? []);\n $failedIds = $result['failed_ids'] ?? [];\n\n $skippedCount = count($this->crmIds) - count($filteredIds);\n\n Log::info($this->getLogPrefix() . ' Batch completed', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'success' => $successCount,\n 'failed' => count($failedIds),\n 'skipped' => $skippedCount,\n 'requested' => count($this->crmIds),\n 'processed' => count($filteredIds),\n 'duration_ms' => $durationMs,\n ]);\n\n if (! empty($failedIds)) {\n Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedCount' => \\count($failedIds),\n 'failedIds' => $failedIds,\n 'errors' => $result['errors'] ?? [],\n ]);\n }\n }\n\n /**\n * Called by Laravel after all $tries are exhausted.\n *\n * System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw\n * an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next\n * SyncObjects cycle picks them up.\n *\n * This does NOT fire for data-level failures (those are caught in the per-object loop\n * and logged without retrying).\n *\n * Requeue Strategy:\n * - Each ID is individually requeued to Redis using SADD (automatic deduplication)\n * - If requeue fails for specific IDs, they are logged as permanently lost\n * - Redis requeue failures are rare (Redis connection issues) but critical\n */\n protected function requeueFailedBatch(\\Throwable $exception): void\n {\n $redisService = app(BatchSyncRedisService::class);\n\n Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'idCount' => \\count($this->crmIds),\n 'error' => $exception->getMessage(),\n ]);\n\n $requeued = 0;\n $failedToRequeue = [];\n\n foreach ($this->crmIds as $crmId) {\n try {\n $redisService->collectObjectIdToBatch(\n $this->getObjectType(),\n (string) $crmId,\n $this->crmConfigurationId,\n 'all'\n );\n $requeued++;\n } catch (\\Throwable $e) {\n $failedToRequeue[] = $crmId;\n Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'crmId' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'requeued' => $requeued,\n 'failedToRequeue' => \\count($failedToRequeue),\n 'total' => \\count($this->crmIds),\n ]);\n\n if (! empty($failedToRequeue)) {\n Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [\n 'crmConfigurationId' => $this->crmConfigurationId,\n 'failedIds' => $failedToRequeue,\n ]);\n }\n }\n\n private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $objectType = $this->getObjectType();\n\n if ($objectType === self::OBJECT_TYPE_CONTACT) {\n return $this->filterExistingContacts($crmConfig, $crmEntityRepository);\n }\n\n if ($objectType === self::OBJECT_TYPE_COMPANY) {\n return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);\n }\n\n return $this->crmIds;\n }\n\n private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingContacts);\n\n return array_values($existingIds);\n }\n\n private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array\n {\n $existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);\n $existingIds = array_intersect($this->crmIds, $existingAccounts);\n\n return array_values($existingIds);\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, 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":false,"role_description":"text"},{"role":"AXStaticText","text":".vscode, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".windsurf, folder","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, folder","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Component, folder","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Acl, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch, folder","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, folder","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","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AWS, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Cache, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback, folder","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, folder","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, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParagraphBreaker, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantSpeech, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PartitionedCookie, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPage, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playlist, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Prophet, folder","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, 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":"Job, folder","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, 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"},{"role":"AXStaticText","text":"Twilio, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Uploader, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UrlGenerator, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Utility, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Exceptions, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Service, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Waveform, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Webhooks, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Workflow, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Configuration, folder","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, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activities, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Analytics, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Calendars, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Crm, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Hubspot, folder","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IntegrationApp, folder","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Traits, folder","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, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dev, folder","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, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DTOs, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Elasticsearch, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EngagementStats, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GeckoExport, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Livestream, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Mailboxes, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Migrate, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemes, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playbooks, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playlists, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Postmark, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProphetAi, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Reports, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AutomatedReportsCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AutomatedReportsRetentionPolicyCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AutomatedReportsSendCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CreateMockAskJiminnyReportResultCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DeleteReportCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GenerateMarketingReport.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Team.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Usage.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Slack, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Teams, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Tracks, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Transcription, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Twilio, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Users, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Vocabulary, folder","depth":10,"on_screen":false,"role_description":"text"}]...
|
7779906935798767145
|
2296323553153308900
|
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
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
17
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm\Hubspot;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Support\Facades\Log;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\CrmConfigurationRepository;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\BatchSyncRedisService;
use Jiminny\Services\ResolveTeamCrmConnection;
/**
* Shared logic for HubSpot batch import jobs.
*
* Provides common functionality for importing batches of HubSpot objects (deals, contacts, companies)
* with consistent error handling, logging, and failure recovery mechanisms.
*
* Failure Handling Strategy:
*
* 1. SYSTEM-LEVEL FAILURES (HubSpot API down, DB connection lost, timeout):
* - Exception propagates out of handle()
* - Laravel retries the job up to $tries times with $backoff delays
* - If all retries exhausted, failed() requeues ALL IDs back to Redis
* - Next SyncObjects cycle will pick them up and retry
*
* 2. DATA-LEVEL FAILURES (per-object exceptions during import):
* - Caught inside the per-object loop in import*BatchByIds() methods
* - Indicate permanent issues: DB constraints, corrupt data, unmappable values
* - Retrying won't fix them - logged with specific error per ID
* - NOT requeued to avoid infinite retry loops
* - Require manual investigation and data correction
*
* Note: Objects intentionally skipped (missing dependencies like account, unknown pipeline/stage)
* return null and are not considered failures - they simply cannot be imported until dependencies exist.
*/
trait ImportBatchJobTrait
{
private const string OBJECT_TYPE_CONTACT = 'contact';
private const string OBJECT_TYPE_COMPANY = 'company';
private const string OBJECT_TYPE_DEAL = 'deal';
private const int LOCK_EXPIRES_AFTER_SECONDS = 360;
private const string [ENV_SECRET];
private int $crmConfigurationId;
private array $crmIds;
abstract protected function getObjectType(): string;
abstract protected function getLogPrefix(): string;
abstract protected function importBatch(HubspotInterface $crmService, array $crmIds): array;
/**
* Serialize HubSpot import batches per CRM configuration across all object types.
*
* `shared()` makes the lock key omit the job class, so ImportOpportunityBatch,
* ImportContactBatch and ImportAccountBatch for the same crm_configuration_id
* contend on a single lock. This prevents concurrent imports from causing
* gap-lock contention on the `accounts` and `contacts` unique indexes.
*
* Duplicates are dropped (not released back to the queue). On SQS, each release
* increments the message's ApproximateReceiveCount, which Laravel reads as
* $job->attempts(). With $tries = 3 and lock-holders that can run for >45s,
* releasing duplicates causes them to exhaust their attempt budget while waiting
* and trip MaxAttemptsExceededException without ever running. Dropping is safe
* here because SyncObjects rediscovers IDs on every cycle, so any IDs carried
* by a dropped duplicate will be re-batched on the next sync.
*/
public function middleware(): array
{
return [
(new WithoutOverlapping(self::LOCK_KEY_PREFIX . $this->crmConfigurationId))
->shared()
->expireAfter(self::LOCK_EXPIRES_AFTER_SECONDS)
->dontRelease(),
];
}
protected function processImportBatch(
ResolveTeamCrmConnection $resolveTeamCrmConnection,
CrmConfigurationRepository $crmConfigurationRepository,
CrmEntityRepository $crmEntityRepository
): void {
$crmConfig = $crmConfigurationRepository->findById($this->crmConfigurationId);
if ($crmConfig === null) {
Log::error($this->getLogPrefix() . ' CRM configuration not found', [
'crmConfigurationId' => $this->crmConfigurationId,
]);
return;
}
$crmService = $resolveTeamCrmConnection->resolveForTeam($crmConfig->getTeam());
if (! $crmService instanceof HubspotInterface) {
Log::error($this->getLogPrefix() . ' CRM service is not HubSpot', [
'crmConfigurationId' => $this->crmConfigurationId,
'serviceClass' => $crmService::class,
]);
return;
}
Log::info($this->getLogPrefix() . ' Processing batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'batchSize' => count($this->crmIds),
]);
$filteredIds = $this->filterExistingObjects($crmConfig, $crmEntityRepository);
if (empty($filteredIds)) {
Log::info($this->getLogPrefix() . ' No existing objects found in Jiminny, skipping batch', [
'crmConfigurationId' => $this->crmConfigurationId,
'requestedCount' => count($this->crmIds),
]);
return;
}
$startTime = microtime(true);
$result = $this->importBatch($crmService, $filteredIds);
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$successCount = $result['success_count'] ?? \count($result['success'] ?? []);
$failedIds = $result['failed_ids'] ?? [];
$skippedCount = count($this->crmIds) - count($filteredIds);
Log::info($this->getLogPrefix() . ' Batch completed', [
'crmConfigurationId' => $this->crmConfigurationId,
'success' => $successCount,
'failed' => count($failedIds),
'skipped' => $skippedCount,
'requested' => count($this->crmIds),
'processed' => count($filteredIds),
'duration_ms' => $durationMs,
]);
if (! empty($failedIds)) {
Log::error($this->getLogPrefix() . ' Data-level failures require investigation', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedCount' => \count($failedIds),
'failedIds' => $failedIds,
'errors' => $result['errors'] ?? [],
]);
}
}
/**
* Called by Laravel after all $tries are exhausted.
*
* System-level failure (HubSpot API down, timeout, OOM) - the entire handle() threw
* an unhandled exception on every attempt. Requeue ALL IDs back to Redis so the next
* SyncObjects cycle picks them up.
*
* This does NOT fire for data-level failures (those are caught in the per-object loop
* and logged without retrying).
*
* Requeue Strategy:
* - Each ID is individually requeued to Redis using SADD (automatic deduplication)
* - If requeue fails for specific IDs, they are logged as permanently lost
* - Redis requeue failures are rare (Redis connection issues) but critical
*/
protected function requeueFailedBatch(\Throwable $exception): void
{
$redisService = app(BatchSyncRedisService::class);
Log::error($this->getLogPrefix() . ' Job failed after all retries, requeuing IDs', [
'crmConfigurationId' => $this->crmConfigurationId,
'idCount' => \count($this->crmIds),
'error' => $exception->getMessage(),
]);
$requeued = 0;
$failedToRequeue = [];
foreach ($this->crmIds as $crmId) {
try {
$redisService->collectObjectIdToBatch(
$this->getObjectType(),
(string) $crmId,
$this->crmConfigurationId,
'all'
);
$requeued++;
} catch (\Throwable $e) {
$failedToRequeue[] = $crmId;
Log::warning($this->getLogPrefix() . ' Failed to requeue ID', [
'crmConfigurationId' => $this->crmConfigurationId,
'crmId' => $crmId,
'error' => $e->getMessage(),
]);
}
}
Log::info($this->getLogPrefix() . ' Requeue completed after job failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'requeued' => $requeued,
'failedToRequeue' => \count($failedToRequeue),
'total' => \count($this->crmIds),
]);
if (! empty($failedToRequeue)) {
Log::critical($this->getLogPrefix() . ' Permanently lost IDs after requeue failure', [
'crmConfigurationId' => $this->crmConfigurationId,
'failedIds' => $failedToRequeue,
]);
}
}
private function filterExistingObjects(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$objectType = $this->getObjectType();
if ($objectType === self::OBJECT_TYPE_CONTACT) {
return $this->filterExistingContacts($crmConfig, $crmEntityRepository);
}
if ($objectType === self::OBJECT_TYPE_COMPANY) {
return $this->filterExistingAccounts($crmConfig, $crmEntityRepository);
}
return $this->crmIds;
}
private function filterExistingContacts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingContacts = $crmEntityRepository->getExistingContactCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingContacts);
return array_values($existingIds);
}
private function filterExistingAccounts(Configuration $crmConfig, CrmEntityRepository $crmEntityRepository): array
{
$existingAccounts = $crmEntityRepository->getExistingAccountCrmIds($crmConfig, $this->crmIds);
$existingIds = array_intersect($this->crmIds, $existingAccounts);
return array_values($existingIds);
}
}
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, folder
Component, folder
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything, folder
Dtos, folder
Events, folder
AskAnythingPromptService.php
HistoryService.php
AskJiminnyAi, folder
AWS, folder
BillingManagement, folder
Cache, folder
CoachingFeedback, folder
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks, folder
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
Notification, folder
Nudge, folder
ParagraphBreaker, folder
ParticipantSpeech, folder
PartitionedCookie, folder
PlaybackPage, folder
Playlist, folder
Prophet, folder
ProphetAi, folder
ProsperWorks, folder
Queue, folder
Job, folder
RateLimitAware.php, abstract class
RateLimitAwareWrapper.php, class
BotsQueueConstants.php
Constants.php
ProcessingQueueConstants.php
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
Twilio, folder
Uploader, folder
UrlGenerator, folder
Utility, folder
Exceptions, folder
Service, folder
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid, folder
Waveform, folder
Webhooks, folder
Workflow, folder
Configuration, folder
Console, folder
Commands, folder
Activities, folder
Analytics, folder
Calendars, folder
Crm, folder
Hubspot, folder
IntegrationApp, folder
Traits, folder
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, folder
Dev, folder
AddRateLimitCommand.php, class
FixHubSpotTokens.php, class
FixMissMatchedCrmActivitiesCommand.php, final class
ImportCallsCommand.php, class
MonitorSocialAccountsState.php, class
Dialers, folder
DTOs, folder
Elasticsearch, folder
EngagementStats, folder
GeckoExport, folder
Livestream, folder
Mailboxes, folder
Migrate, folder
PlaybackThemes, folder
Playbooks, folder
Playlists, folder
Postmark, folder
ProphetAi, folder
Reports, folder
AutomatedReportsCommand.php, class
AutomatedReportsRetentionPolicyCommand.php, class
AutomatedReportsSendCommand.php, class
CreateMockAskJiminnyReportResultCommand.php, class
DeleteReportCommand.php, class
GenerateMarketingReport.php, class
Team.php, class
Usage.php, class
Slack, folder
Teams, folder
Tracks, folder
Transcription, folder
Twilio, folder
Users, folder
Vocabulary, folder...
|
2775
|
NULL
|
NULL
|
NULL
|
|
66677
|
2384
|
12
|
2026-05-21T11:14:02.579849+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-21/1779 /Users/lukas/.screenpipe/data/data/2026-05-21/1779362042579_m1.jpg...
|
PhpStorm
|
faVsco.js – ImportActivityTypes.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
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
41
1
40
65
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;
select * from text_relays where created_at > '2026-01-01';
and id IN (32415, 32416);
# and id = 32412;
select * from users where team_id = 2 and email like '%scott%' and id = 29510;
SELECT * FROM activities WHERE uuid_to_bin('67cebfc2-ed56-44a2-8c68-7a0286ed8618') = uuid; # 79763436
SELECT email_provider_id, COUNT(*) as count, GROUP_CONCAT(id) as ids, GROUP_CONCAT(status) as statuses
FROM text_relays
WHERE email_provider_id IN ('19e2027868a64b42', '19e2033ed8ea6b10')
GROUP BY email_provider_id;
SELECT id, status, telephony_provider_id, created_at
FROM activities
WHERE id IN (80028719, 80028846);
SELECT id, status, code, email_sent_at, created_at, updated_at
FROM text_relays
WHERE id IN (32415, 32416);
SELECT id, status, code, sender, recipient, created_at
FROM text_relays
WHERE sender LIKE '%mario.georgiev%' OR sender LIKE '%stoyan.tomov%'
ORDER BY created_at DESC
LIMIT 10;
SELECT id, uuid, status, code, sender, recipient, created_at, updated_at
FROM text_relays
WHERE uuid = uuid_to_bin('0626141c-27a6-4d8c-aff8-7c8020a2c656');
# [PASSWORD_DOTS]
SELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count
FROM users u
INNER JOIN activities a ON u.id = a.user_id
WHERE a.type LIKE 'sms%'
AND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY u.id, u.email, u.name, u.softphone_number
ORDER BY sms_count DESC;
select * from teams where id = 1;
select * from roles;
SELECT * FROM activities WHERE uuid_to_bin('[CREDIT_CARD]-927f-4f4da2a8185c') = uuid; # 80186192
SELECT * FROM crm_configurations WHERE id = 1053;
SELECT * FROM teams WHERE id = 1117;
select * from users where id = 30249;
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Listeners\Crm;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Str;
use Jiminny\Events\Playbooks\PlaybookCreated;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldValue;
use Jiminny\Models\PlaybookCategory;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\PlaybookCategoryRepository;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
use Jiminny\Services\ResolveTeamCrmConnection;
use stdClass;
use Throwable;
class ImportActivityTypes implements ShouldQueue
{
/**
* Create the event listener.
*/
public function __construct(
private readonly ResolveTeamCrmConnection $crmResolver,
private readonly FieldRepository $fieldRepository,
private readonly PlaybookCategoryRepository $repository,
) {
// nothing
}
/**
* Import the standard Event/Task Type picklist options from the CRM.
*/
public function handle(PlaybookCreated $event): void
{
$playbook = $event->playbook;
// Don't run if somehow we already have categories.
if ($playbook->getCategories()->isNotEmpty()) {
return;
}
$values = [];
try {
$crmService = $this->crmResolver->resolveForTeam($playbook->getTeam());
$crmService->syncField($playbook->getActivityField());
$values = $crmService->importPicklistValues($playbook->getActivityField());
} catch (Throwable $e) {
Log::warning('[ImportActivityTypes] CRM API failed, falling back to database values', [
'playbook_id' => $playbook->getId(),
'team_id' => $playbook->getTeamId(),
'error' => $e->getMessage(),
]);
}
if (empty($values)) {
$values = $this->fetchActivityFieldValues($playbook->getActivityField());
Log::info('[ImportActivityTypes] Using database fallback for categories', [
'playbook_id' => $playbook->getId(),
'field_values_count' => $values->count(),
]);
}
$createdCount = 0;
/** @var stdClass{label: string} $value */
foreach ($values as $value) {
$data = [
'name' => $value->label,
'enabled' => true,
'type' => PlaybookCategory::TYPE_ALL,
];
if (Str::contains(strtolower($value->label), ['sms sent', 'sms out', 'text in'])) {
$data['type'] = PlaybookCategory::TYPE_SMS_OUTBOUND;
}
if (Str::contains(strtolower($value->label), ['sms received', 'sms in', 'text out'])) {
$data['type'] = PlaybookCategory::TYPE_SMS_INBOUND;
}
$this->repository->create($playbook, $data);
$createdCount++;
}
if ($createdCount === 0) {
Log::warning('[ImportActivityTypes] No categories created for playbook', [
'playbook_id' => $playbook->getId(),
'team_id' => $playbook->getTeamId(),
'field_id' => $playbook->getActivityField()?->getId(),
]);
}
}
private function fetchActivityFieldValues(Field $field): Collection
{
/** @var Collection<FieldValue> */
return $this->fieldRepository->getPicklistValues($field);
}
}
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":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master<br/>74 incoming commits<br/>","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":"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":"41","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":"65","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;\n\nselect * from text_relays where created_at > '2026-01-01';\nand id IN (32415, 32416);\n# and id = 32412;\n\nselect * from users where team_id = 2 and email like '%scott%' and id = 29510;\n\nSELECT * FROM activities WHERE uuid_to_bin('67cebfc2-ed56-44a2-8c68-7a0286ed8618') = uuid; # 79763436\n\nSELECT email_provider_id, COUNT(*) as count, GROUP_CONCAT(id) as ids, GROUP_CONCAT(status) as statuses\nFROM text_relays\nWHERE email_provider_id IN ('19e2027868a64b42', '19e2033ed8ea6b10')\nGROUP BY email_provider_id;\nSELECT id, status, telephony_provider_id, created_at\nFROM activities\nWHERE id IN (80028719, 80028846);\nSELECT id, status, code, email_sent_at, created_at, updated_at\nFROM text_relays\nWHERE id IN (32415, 32416);\nSELECT id, status, code, sender, recipient, created_at\nFROM text_relays\nWHERE sender LIKE '%mario.georgiev%' OR sender LIKE '%stoyan.tomov%'\nORDER BY created_at DESC\nLIMIT 10;\n\nSELECT id, uuid, status, code, sender, recipient, created_at, updated_at\nFROM text_relays\nWHERE uuid = uuid_to_bin('0626141c-27a6-4d8c-aff8-7c8020a2c656');\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nselect * from teams where id = 1;\n\nselect * from roles;\n\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;","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;\n\nselect * from text_relays where created_at > '2026-01-01';\nand id IN (32415, 32416);\n# and id = 32412;\n\nselect * from users where team_id = 2 and email like '%scott%' and id = 29510;\n\nSELECT * FROM activities WHERE uuid_to_bin('67cebfc2-ed56-44a2-8c68-7a0286ed8618') = uuid; # 79763436\n\nSELECT email_provider_id, COUNT(*) as count, GROUP_CONCAT(id) as ids, GROUP_CONCAT(status) as statuses\nFROM text_relays\nWHERE email_provider_id IN ('19e2027868a64b42', '19e2033ed8ea6b10')\nGROUP BY email_provider_id;\nSELECT id, status, telephony_provider_id, created_at\nFROM activities\nWHERE id IN (80028719, 80028846);\nSELECT id, status, code, email_sent_at, created_at, updated_at\nFROM text_relays\nWHERE id IN (32415, 32416);\nSELECT id, status, code, sender, recipient, created_at\nFROM text_relays\nWHERE sender LIKE '%mario.georgiev%' OR sender LIKE '%stoyan.tomov%'\nORDER BY created_at DESC\nLIMIT 10;\n\nSELECT id, uuid, status, code, sender, recipient, created_at, updated_at\nFROM text_relays\nWHERE uuid = uuid_to_bin('0626141c-27a6-4d8c-aff8-7c8020a2c656');\n\n# ***************\nSELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count\nFROM users u\nINNER JOIN activities a ON u.id = a.user_id\nWHERE a.type LIKE 'sms%'\nAND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)\nGROUP BY u.id, u.email, u.name, u.softphone_number\nORDER BY sms_count DESC;\n\nselect * from teams where id = 1;\n\nselect * from roles;\n\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;","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":"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\\Listeners\\Crm;\n\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Events\\Playbooks\\PlaybookCreated;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\FieldValue;\nuse Jiminny\\Models\\PlaybookCategory;\nuse Jiminny\\Repositories\\Crm\\FieldRepository;\nuse Jiminny\\Repositories\\PlaybookCategoryRepository;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\nuse stdClass;\nuse Throwable;\n\nclass ImportActivityTypes implements ShouldQueue\n{\n /**\n * Create the event listener.\n */\n public function __construct(\n private readonly ResolveTeamCrmConnection $crmResolver,\n private readonly FieldRepository $fieldRepository,\n private readonly PlaybookCategoryRepository $repository,\n ) {\n // nothing\n }\n\n /**\n * Import the standard Event/Task Type picklist options from the CRM.\n */\n public function handle(PlaybookCreated $event): void\n {\n $playbook = $event->playbook;\n\n // Don't run if somehow we already have categories.\n if ($playbook->getCategories()->isNotEmpty()) {\n return;\n }\n\n $values = [];\n\n try {\n $crmService = $this->crmResolver->resolveForTeam($playbook->getTeam());\n $crmService->syncField($playbook->getActivityField());\n $values = $crmService->importPicklistValues($playbook->getActivityField());\n } catch (Throwable $e) {\n Log::warning('[ImportActivityTypes] CRM API failed, falling back to database values', [\n 'playbook_id' => $playbook->getId(),\n 'team_id' => $playbook->getTeamId(),\n 'error' => $e->getMessage(),\n ]);\n }\n\n if (empty($values)) {\n $values = $this->fetchActivityFieldValues($playbook->getActivityField());\n\n Log::info('[ImportActivityTypes] Using database fallback for categories', [\n 'playbook_id' => $playbook->getId(),\n 'field_values_count' => $values->count(),\n ]);\n }\n\n $createdCount = 0;\n\n /** @var stdClass{label: string} $value */\n foreach ($values as $value) {\n $data = [\n 'name' => $value->label,\n 'enabled' => true,\n 'type' => PlaybookCategory::TYPE_ALL,\n ];\n\n if (Str::contains(strtolower($value->label), ['sms sent', 'sms out', 'text in'])) {\n $data['type'] = PlaybookCategory::TYPE_SMS_OUTBOUND;\n }\n\n if (Str::contains(strtolower($value->label), ['sms received', 'sms in', 'text out'])) {\n $data['type'] = PlaybookCategory::TYPE_SMS_INBOUND;\n }\n\n $this->repository->create($playbook, $data);\n $createdCount++;\n }\n\n if ($createdCount === 0) {\n Log::warning('[ImportActivityTypes] No categories created for playbook', [\n 'playbook_id' => $playbook->getId(),\n 'team_id' => $playbook->getTeamId(),\n 'field_id' => $playbook->getActivityField()?->getId(),\n ]);\n }\n }\n\n private function fetchActivityFieldValues(Field $field): Collection\n {\n /** @var Collection<FieldValue> */\n return $this->fieldRepository->getPicklistValues($field);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Listeners\\Crm;\n\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Events\\Playbooks\\PlaybookCreated;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\FieldValue;\nuse Jiminny\\Models\\PlaybookCategory;\nuse Jiminny\\Repositories\\Crm\\FieldRepository;\nuse Jiminny\\Repositories\\PlaybookCategoryRepository;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Services\\ResolveTeamCrmConnection;\nuse stdClass;\nuse Throwable;\n\nclass ImportActivityTypes implements ShouldQueue\n{\n /**\n * Create the event listener.\n */\n public function __construct(\n private readonly ResolveTeamCrmConnection $crmResolver,\n private readonly FieldRepository $fieldRepository,\n private readonly PlaybookCategoryRepository $repository,\n ) {\n // nothing\n }\n\n /**\n * Import the standard Event/Task Type picklist options from the CRM.\n */\n public function handle(PlaybookCreated $event): void\n {\n $playbook = $event->playbook;\n\n // Don't run if somehow we already have categories.\n if ($playbook->getCategories()->isNotEmpty()) {\n return;\n }\n\n $values = [];\n\n try {\n $crmService = $this->crmResolver->resolveForTeam($playbook->getTeam());\n $crmService->syncField($playbook->getActivityField());\n $values = $crmService->importPicklistValues($playbook->getActivityField());\n } catch (Throwable $e) {\n Log::warning('[ImportActivityTypes] CRM API failed, falling back to database values', [\n 'playbook_id' => $playbook->getId(),\n 'team_id' => $playbook->getTeamId(),\n 'error' => $e->getMessage(),\n ]);\n }\n\n if (empty($values)) {\n $values = $this->fetchActivityFieldValues($playbook->getActivityField());\n\n Log::info('[ImportActivityTypes] Using database fallback for categories', [\n 'playbook_id' => $playbook->getId(),\n 'field_values_count' => $values->count(),\n ]);\n }\n\n $createdCount = 0;\n\n /** @var stdClass{label: string} $value */\n foreach ($values as $value) {\n $data = [\n 'name' => $value->label,\n 'enabled' => true,\n 'type' => PlaybookCategory::TYPE_ALL,\n ];\n\n if (Str::contains(strtolower($value->label), ['sms sent', 'sms out', 'text in'])) {\n $data['type'] = PlaybookCategory::TYPE_SMS_OUTBOUND;\n }\n\n if (Str::contains(strtolower($value->label), ['sms received', 'sms in', 'text out'])) {\n $data['type'] = PlaybookCategory::TYPE_SMS_INBOUND;\n }\n\n $this->repository->create($playbook, $data);\n $createdCount++;\n }\n\n if ($createdCount === 0) {\n Log::warning('[ImportActivityTypes] No categories created for playbook', [\n 'playbook_id' => $playbook->getId(),\n 'team_id' => $playbook->getTeamId(),\n 'field_id' => $playbook->getActivityField()?->getId(),\n ]);\n }\n }\n\n private function fetchActivityFieldValues(Field $field): Collection\n {\n /** @var Collection<FieldValue> */\n return $this->fieldRepository->getPicklistValues($field);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"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}]...
|
2327371000253566477
|
1065731412833220165
|
idle
|
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
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
41
1
40
65
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;
select * from text_relays where created_at > '2026-01-01';
and id IN (32415, 32416);
# and id = 32412;
select * from users where team_id = 2 and email like '%scott%' and id = 29510;
SELECT * FROM activities WHERE uuid_to_bin('67cebfc2-ed56-44a2-8c68-7a0286ed8618') = uuid; # 79763436
SELECT email_provider_id, COUNT(*) as count, GROUP_CONCAT(id) as ids, GROUP_CONCAT(status) as statuses
FROM text_relays
WHERE email_provider_id IN ('19e2027868a64b42', '19e2033ed8ea6b10')
GROUP BY email_provider_id;
SELECT id, status, telephony_provider_id, created_at
FROM activities
WHERE id IN (80028719, 80028846);
SELECT id, status, code, email_sent_at, created_at, updated_at
FROM text_relays
WHERE id IN (32415, 32416);
SELECT id, status, code, sender, recipient, created_at
FROM text_relays
WHERE sender LIKE '%mario.georgiev%' OR sender LIKE '%stoyan.tomov%'
ORDER BY created_at DESC
LIMIT 10;
SELECT id, uuid, status, code, sender, recipient, created_at, updated_at
FROM text_relays
WHERE uuid = uuid_to_bin('0626141c-27a6-4d8c-aff8-7c8020a2c656');
# [PASSWORD_DOTS]
SELECT DISTINCT u.id, u.email, u.name, u.softphone_number, COUNT(a.id) as sms_count
FROM users u
INNER JOIN activities a ON u.id = a.user_id
WHERE a.type LIKE 'sms%'
AND a.created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY u.id, u.email, u.name, u.softphone_number
ORDER BY sms_count DESC;
select * from teams where id = 1;
select * from roles;
SELECT * FROM activities WHERE uuid_to_bin('[CREDIT_CARD]-927f-4f4da2a8185c') = uuid; # 80186192
SELECT * FROM crm_configurations WHERE id = 1053;
SELECT * FROM teams WHERE id = 1117;
select * from users where id = 30249;
Sync Changes
Hide This Notification
Code changed:
Hide
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Listeners\Crm;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Str;
use Jiminny\Events\Playbooks\PlaybookCreated;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldValue;
use Jiminny\Models\PlaybookCategory;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\PlaybookCategoryRepository;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
use Jiminny\Services\ResolveTeamCrmConnection;
use stdClass;
use Throwable;
class ImportActivityTypes implements ShouldQueue
{
/**
* Create the event listener.
*/
public function __construct(
private readonly ResolveTeamCrmConnection $crmResolver,
private readonly FieldRepository $fieldRepository,
private readonly PlaybookCategoryRepository $repository,
) {
// nothing
}
/**
* Import the standard Event/Task Type picklist options from the CRM.
*/
public function handle(PlaybookCreated $event): void
{
$playbook = $event->playbook;
// Don't run if somehow we already have categories.
if ($playbook->getCategories()->isNotEmpty()) {
return;
}
$values = [];
try {
$crmService = $this->crmResolver->resolveForTeam($playbook->getTeam());
$crmService->syncField($playbook->getActivityField());
$values = $crmService->importPicklistValues($playbook->getActivityField());
} catch (Throwable $e) {
Log::warning('[ImportActivityTypes] CRM API failed, falling back to database values', [
'playbook_id' => $playbook->getId(),
'team_id' => $playbook->getTeamId(),
'error' => $e->getMessage(),
]);
}
if (empty($values)) {
$values = $this->fetchActivityFieldValues($playbook->getActivityField());
Log::info('[ImportActivityTypes] Using database fallback for categories', [
'playbook_id' => $playbook->getId(),
'field_values_count' => $values->count(),
]);
}
$createdCount = 0;
/** @var stdClass{label: string} $value */
foreach ($values as $value) {
$data = [
'name' => $value->label,
'enabled' => true,
'type' => PlaybookCategory::TYPE_ALL,
];
if (Str::contains(strtolower($value->label), ['sms sent', 'sms out', 'text in'])) {
$data['type'] = PlaybookCategory::TYPE_SMS_OUTBOUND;
}
if (Str::contains(strtolower($value->label), ['sms received', 'sms in', 'text out'])) {
$data['type'] = PlaybookCategory::TYPE_SMS_INBOUND;
}
$this->repository->create($playbook, $data);
$createdCount++;
}
if ($createdCount === 0) {
Log::warning('[ImportActivityTypes] No categories created for playbook', [
'playbook_id' => $playbook->getId(),
'team_id' => $playbook->getTeamId(),
'field_id' => $playbook->getActivityField()?->getId(),
]);
}
}
private function fetchActivityFieldValues(Field $field): Collection
{
/** @var Collection<FieldValue> */
return $this->fieldRepository->getPicklistValues($field);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|