|
85767
|
2941
|
7
|
2026-05-28T13:09:07.005220+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973747005_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(...
|
[{"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","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":"Built-in Preview","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":"Chrome","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":"Firefox","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":"Safari","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":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"32","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.010305851,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"81","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.009640957,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"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 Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.41589096,"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.4245346,"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.43550533,"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.44414893,"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.45279256,"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.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":"Tx: Auto","depth":4,"bounds":{"left":0.47473404,"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.5013298,"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.51230055,"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.7237367,"top":0.09896249,"width":0.02825798,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"45","depth":4,"bounds":{"left":0.6938165,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.70611703,"top":0.123703115,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"41","depth":4,"bounds":{"left":0.71542555,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"66","depth":4,"bounds":{"left":0.72706115,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7390292,"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.7463431,"top":0.12210695,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993\nSELECT * FROM users WHERE id = 25061;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 994;\nSELECT * FROM crm_profiles WHERE user_id = 25061;\n\nselect * from crm_configurations where id = 834;\nSELECT * FROM teams WHERE id = 882;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 882 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal\nSELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 933 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;\n\nSELECT * FROM contacts where crm_configuration_id = 834;\nSELECT * FROM opportunities WHERE team_id = 933\n# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');\nAND id IN (8482561,18352941,19042734,19232139,19445140,19472541);\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; #\nSELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 933 and sa.provider = 'hubspot';\n\nselect crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id\nwhere crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')\n# and l.converted_at IS NOT NULL\n;\n\n# ********************************************************************\nSELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')\nand opportunity_id IS NULL\norder by id desc;\n\nSELECT * FROM teams WHERE id = 604; # 598\nSELECT * FROM activities WHERE id = 74410828; # chelseaw@allvoices.co\nSELECT * FROM accounts WHERE id = 20068382;\nSELECT * FROM accounts WHERE id = 35186038;\n\nSELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 559 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;\nselect * from sidekick_settings where team_id = 781;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 711;\nSELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL\nand is_internal = 0 and status = 'completed'\norder by id desc;\n\nSELECT * FROM crm_layout_entities\nWHERE crm_layout_id IN (2352, 2353);\n;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;\nSELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;\nselect * from contacts\nwhere crm_configuration_id = 530\nand crm_provider_id = 872252;\n\nselect * from activities where crm_configuration_id = 530\nand user_id = 14343 and type like '%softphone%'\nand created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);\n\n\nSELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t\nJOIN crm_configurations c ON t.id = c.team_id\nWHERE t.status = 'active';\n\nSELECT * FROM teams where id = 1091;\nSELECT * FROM crm_configurations where team_id = 1091;\nSELECT * FROM activity_providers where team_id = 1091;\nSELECT * FROM activities where crm_configuration_id = 1024 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\n\n\nSELECT * FROM teams WHERE name LIKE '%Leadventure%';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1091 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812\nSELECT * FROM teams where id = 862;\nSELECT * FROM crm_configurations where team_id = 862;\nSELECT * FROM activity_providers where team_id = 862;\nSELECT * FROM activities where crm_configuration_id = 812 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\n\n\nSELECT t.id, crm.id, crm.provider, ap.* FROM teams t\njoin crm_configurations crm on t.id = crm.team_id\njoin activity_providers ap on t.id = ap.team_id\nwhere t.status = 'active' and ap.is_enabled = 1\nand crm.provider = 'hubspot'\nand ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',\n 'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');\n\nSELECT * FROM teams where id = 1068;\nSELECT * FROM crm_configurations where team_id = 1068;\nSELECT * FROM activity_providers where team_id = 1068;\n\nSELECT * FROM activities a\nwhere crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')\nand a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'\n )\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by a.id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1068 and sa.provider = 'hubspot';\n\n# ********************************************************************\n# ********************************************************************\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 933 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262\nSELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 882 and sa.provider = 'hubspot';\nselect * from crm_layouts where crm_configuration_id = 834;\nselect * from crm_layout_entities where crm_layout_id = 2780;\nselect * from crm_fields where id IN (321153,321192,321193,321194);\n\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1057 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8\n\nSELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20\n\nSELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10\n\nSELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #\n\nSELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;\nselect * from users where team_id = 51; # 7783\nSELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130\nselect * from activity_searches where user_id = 7783;\nselect * from activity_search_filters where activity_search_id IN (32291, 32292);\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations where id = 272; # 290 - Bonham & Brook , portalId: 5705856\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th\n# ********************************************************************\nSELECT * FROM crm_configurations where provider = 'hubspot';\nSELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133\nSELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null\n# ********************************************************************\n\nselect * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';\nselect\n cp.*\n# DISTINCT t.id\n# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields\nFROM crm_profiles cp\nJOIN crm_configurations crm on crm.id = cp.crm_configuration_id\nJOIN users u on u.id = cp.user_id\nJOIN teams t ON t.id = crm.team_id\nWHERE crm.provider = 'salesforce' and t.status = 'active'\n and cp.archived_at IS NULL and u.deleted_at IS NULL\n and t.id NOT IN (1093)\n and t.id = 2\n and cp.contact_fields IS NULL;\n# and c.crm_provider_id = '003Uu00000ojD4NIAU';\n\nSELECT * FROM users WHERE id = 26484;\nSELECT * FROM crm_profiles WHERE user_id = 26484;\nSELECT * FROM social_accounts WHERE sociable_id = 26484;\nSELECT * FROM crm_configurations where provider = 'salesforce';\nselect * from users where id IN (10022, 10403);\nselect * from users where team_id IN (526);\nselect * from teams where id IN (526, 532);\nselect * from crm_configurations where id IN (500, 516);\nselect * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);\nselect * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 526 and sa.provider = 'salesforce';\nselect * from team_settings where team_id IN (526, 532);\n\nselect * from users where id IN (22824);\nselect * from crm_profiles where crm_configuration_id IN (1026);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1093 and sa.provider = 'salesforce';\n\nselect * from teams where id = 1099;\nselect * from users where id = 29643\n\nselect * from activity_processing_states;\n\nSELECT * FROM teams where name LIKE '%Fare%'; # 233\nSELECT * FROM opportunities where crm_configuration_id = 215\n# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'\n;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1088 and sa.provider = 'hubspot';\n\nSELECT * FROM teams order by updated_at DESC\nSELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account\n\nselect * from crm_configurations where provider = 'pipedrive';\n\nselect * from teams where id = 957;\nselect * from crm_configurations where id = 957;\n\nSELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743\nSELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;\n\nselect * from users where team_id = 1; # 26726 - Gabriela Dureva\nSELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific\nselect * from activities where user_id = 26726 order by id desc;\nselect * from contacts where crm_configuration_id = 1\nand email IN ('charlotte.ward@prolific.com', 'frankie.bryant@prolific.com'); # 2094416, 2093620\nSELECT * FROM contacts WHERE id = 6284931;\n\nSELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id\nWHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;\n\nselect * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);\nselect * from crm_configurations where id = 1;\n\n43801692-1aeb-32ce-acba-5b80a479701a\n44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b\n405975c0-b3d0-7aaa-821f-09d59cae6dd1\n4caf848d-4bed-2299-b248-7788d41f9fca\n49bedc3f-f196-eef3-89c3-dea6a3b4aa63\n43420989-a09d-b8f8-9806-c8bbf7a02aac\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1 and sa.provider = 'salesforce';\n\nSELECT * FROM activities WHERE id = 75461988;\n\nSELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;\n\nselect * from contacts where id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nselect * from users where id = 21047;\nSELECT * FROM crm_configurations WHERE id = 892;\nSELECT * FROM teams WHERE id = 942;\nselect * from opportunities where team_id = 942 order by updated_at desc;\nselect * from contacts where team_id = 942 order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 942 and sa.provider = 'hubspot';\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430\nSELECT * FROM crm_configurations WHERE id = 1;\nSELECT * FROM teams WHERE crm_id = 1;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1 and sa.provider = 'salesforce';\n\nselect id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1\nSELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430\n\nselect * from teams where id = 852;\nselect * from groups where id = 2286;\nselect * from sidekick_settings where team_id = 852;\nselect * from default_activity_types where team_id = 852;\n\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1 AND u.deleted_at IS NULL\nAND u.crm_required = 1\nAND u.team_id = 1\nORDER BY u.team_id;\n\nSELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (\n18481\n );\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1\n AND u.deleted_at IS NULL\n AND u.crm_required = 1\n# AND u.team_id = 1\n AND p.id IS NULL -- Move this condition to WHERE clause\nORDER BY u.team_id;\n\nSELECT * FROM opportunities WHERE id = 20002609;\nselect * from teams where id = 1122; # Velatir, 29953 - christian@velatir.com\nselect * from crm_configurations where id = 1060;\nselect * from crm_layouts where crm_configuration_id = 1060;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1122 and sa.provider = 'hubspot';\nselect * from opportunities where team_id = 1122 order by updated_at desc;\n\nselect * from crm_field_data where object_type = 'contact';\n\nSELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 248 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS\nSELECT * FROM users where id = 24115;\nSELECT * FROM accounts where id = 4002896;\nSELECT * FROM teams WHERE name LIKE '%adswerve%';\nSELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN (\"0069N000003GIQ9QAO\",\"0061r000019yGP9AAM\",\"0066900001S2KWlAAN\",\"0066900001TDpj2AAD\",\"0066900001b8uEwAAI\",\"0069N000001rQi0QAE\",\"006QF00000KD40mYAD\",\"006QF00000LzpRJYAZ\",\"0069N000002uomtQAA\",\"0069N000002xlMLQAY\",\"0066900001NV6ubAAD\",\"0061r00001HJp45AAD\",\"006QF00000uTlUoYAK\",\"006QF00000v0bZqYAI\");\nSELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203\n\nSELECT u.id, u.email, ac.name, a.* FROM activities a\nJOIN users u ON a.user_id = u.id\nJOIN accounts ac ON a.account_id = ac.id\nWHERE\nuuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or\nuuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or\nuuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;\n\nselect * from users where id = 5825;\nSELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;\n\nselect * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;\n19594, 862\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 862 and sa.provider = 'salesforce';\n\nselect * from automated_reports where id = 36;\nselect ar.frequency, r.*, ar.* from automated_report_results r\njoin automated_reports ar on r.report_id = ar.id\nwhere ar.frequency != 'one_off';\n\nselect s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;\nselect * from nudges n where n.activity_search_id\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;\n\nselect * from users where team_id = 1 and name like '%Lukas%'; # 7160\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\nSELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,\nselect * from opportunities where team_id = 1126;\nSELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,\nselect * from opportunities where team_id = 1125;\nselect * from contacts c\nwhere c.team_id = 882;\n\nSELECT * FROM activities WHERE id = 76822967;\nSELECT * FROM crm_profiles WHERE user_id = 15440;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 555;\nSELECT * FROM crm_configurations WHERE id = 555;\nSELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 581 and sa.provider = 'salesforce';\n\nSELECT * FROM automated_report_results order by id desc;\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556;\n\nselect * from automated_reports;\nwhere id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , [\"pdf\",\"podcast\"]\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\nselect * from automated_report_results order by id desc;\nSELECT * FROM automated_report_results WHERE id = 1919;\n\nselect * from automated_report_results WHERE report_id = 54;\n\nselect * from opportunities where id = 7594349;\n\nSELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyintegration@lesmills.com\nselect * from playbooks where team_id = 711; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 5515;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 692;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 711 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;\n\nselect * from leads;\n\nselect * from calendars;\n\nSELECT\n t.id AS team_id,\n t.name,\n LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain\nFROM teams t\nJOIN users u ON u.team_id = t.id\nJOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'\nLEFT JOIN team_domains td\n ON td.team_id = t.id\n AND td.deleted_at IS NULL\n AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))\nGROUP BY t.id, t.name, calendar_domain\nORDER BY t.name, calendar_domain;\n\nselect * from users u join calendars c on c.user_id = u.id\nwhere u.team_id = 882;\n\n\nselect * from activities where id = 74049485; # team 563 crm 537\nselect * from activities where id = 73272382; # team 563 crm 537\nselect * from activities where id = 64400389; # team 563 crm 537\nselect * from activities where id = 58081273; # team 563 crm 537\nselect * from activities where id = 54520297; # team 563 crm 537\nselect * from participants where activity_id = 58081273;\n\nselect * from activities where crm_configuration_id = 537 and provider = 'aircall'\nand account_id = 19003658 order by updated_at desc;\n\nselect * from contacts where crm_configuration_id = 537 and id = 35957759;\nselect * from accounts where crm_configuration_id = 537 and id = 19003658;\n\nselect * from automated_report_results where id = 1976;\nselect * from automated_reports where id = 583;\nselect * from activity_searches where id = 87714;\nselect * from activity_search_filters where activity_search_id = 87714;\n\nSELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid\nor uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot';\nselect * from rate_limits;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2\nand id IN (18, 1872);\nselect * from automated_reports where id = 54;\nSELECT * FROM users WHERE id IN (24623,29443,29613);\n\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\n\nselect * from text_relays where created_at > '2026-05-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 = .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\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 = 1117 and sa.provider = 'hubspot';\nSELECT * FROM activities WHERE uuid_to_bin('8024fffb-2df7-4017-91f4-d9f896050248') = uuid; # 79933459 YES\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192 NO\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;\nselect * from playbooks where id = 5473;\nselect * from playbook_categories where id = 43783;\nselect * from playbook_categories where playbook_id = 5473;\nselect * from crm_fields where id = 659242;\nselect * from crm_field_values where crm_field_id = 659242;\n\nSELECT * FROM crm_field_data fd\n# JOIN crm_fields f ON fd.crm_field_id = f.id\n# JOIN activities a ON fd.activity_id = a.id\nWHERE activity_id = 79933459\n# AND f.crm_provider_id = 'hs_activity_type';\n\n\nSELECT * FROM activity_messages;\nselect * from text_relays where created_at > '2026-05-01';\nselect * from activities where user_id IN (7160, 18608) and created_at > '2026-05-22' order by id desc;\nselect * from users where team_id = 1 and id IN (18608, 13934, 7160);\nselect * from activities where user_id = 7160 order by id desc limit 10;\n\nselect * from accounts where team_id = 1 and name = 'Column5';\n\nselect * from users where name like '%Subra%'; # 31054, 1117\nselect * from teams where id = 1117;\nselect * from activity_searches where user_id = 31054;\nselect * from activity_search_filters where activity_search_id IN (88882, 88902);","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-05-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 = .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\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 = 1117 and sa.provider = 'hubspot';\nSELECT * FROM activities WHERE uuid_to_bin('8024fffb-2df7-4017-91f4-d9f896050248') = uuid; # 79933459 YES\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192 NO\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;\nselect * from playbooks where id = 5473;\nselect * from playbook_categories where id = 43783;\nselect * from playbook_categories where playbook_id = 5473;\nselect * from crm_fields where id = 659242;\nselect * from crm_field_values where crm_field_id = 659242;\n\nSELECT * FROM crm_field_data fd\n# JOIN crm_fields f ON fd.crm_field_id = f.id\n# JOIN activities a ON fd.activity_id = a.id\nWHERE activity_id = 79933459\n# AND f.crm_provider_id = 'hs_activity_type';\n\n\nSELECT * FROM activity_messages;\nselect * from text_relays where created_at > '2026-05-01';\nselect * from activities where user_id IN (7160, 18608) and created_at > '2026-05-22' order by id desc;\nselect * from users where team_id = 1 and id IN (18608, 13934, 7160);\nselect * from activities where user_id = 7160 order by id desc limit 10;\n\nselect * from accounts where team_id = 1 and name = 'Column5';\n\nselect * from users where name like '%Subra%'; # 31054, 1117\nselect * from teams where id = 1117;\nselect * from activity_searches where user_id = 31054;\nselect * from activity_search_filters where activity_search_id IN (88882, 88902);","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}]...
|
4911831517688950861
|
-6520523836328617179
|
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
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(...
|
85765
|
NULL
|
NULL
|
NULL
|
|
85766
|
2940
|
7
|
2026-05-28T13:08:55.477657+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973735477_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(...
|
[{"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","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":"Built-in Preview","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":"Chrome","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":"Firefox","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":"Safari","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":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"32","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.021527778,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"81","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.02013889,"height":0.02111111},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"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 Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"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":"45","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"41","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"66","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-05-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 = .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\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 = 1117 and sa.provider = 'hubspot';\nSELECT * FROM activities WHERE uuid_to_bin('8024fffb-2df7-4017-91f4-d9f896050248') = uuid; # 79933459 YES\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192 NO\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;\nselect * from playbooks where id = 5473;\nselect * from playbook_categories where id = 43783;\nselect * from playbook_categories where playbook_id = 5473;\nselect * from crm_fields where id = 659242;\nselect * from crm_field_values where crm_field_id = 659242;\n\nSELECT * FROM crm_field_data fd\n# JOIN crm_fields f ON fd.crm_field_id = f.id\n# JOIN activities a ON fd.activity_id = a.id\nWHERE activity_id = 79933459\n# AND f.crm_provider_id = 'hs_activity_type';\n\n\nSELECT * FROM activity_messages;\nselect * from text_relays where created_at > '2026-05-01';\nselect * from activities where user_id IN (7160, 18608) and created_at > '2026-05-22' order by id desc;\nselect * from users where team_id = 1 and id IN (18608, 13934, 7160);\nselect * from activities where user_id = 7160 order by id desc limit 10;\n\nselect * from accounts where team_id = 1 and name = 'Column5';\n\nselect * from users where name like '%Subra%'; # 31054, 1117\nselect * from teams where id = 1117;\nselect * from activity_searches where user_id = 31054;\nselect * from activity_search_filters where activity_search_id IN (88882, 88902);","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-05-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 = .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\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 = 1117 and sa.provider = 'hubspot';\nSELECT * FROM activities WHERE uuid_to_bin('8024fffb-2df7-4017-91f4-d9f896050248') = uuid; # 79933459 YES\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192 NO\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;\nselect * from playbooks where id = 5473;\nselect * from playbook_categories where id = 43783;\nselect * from playbook_categories where playbook_id = 5473;\nselect * from crm_fields where id = 659242;\nselect * from crm_field_values where crm_field_id = 659242;\n\nSELECT * FROM crm_field_data fd\n# JOIN crm_fields f ON fd.crm_field_id = f.id\n# JOIN activities a ON fd.activity_id = a.id\nWHERE activity_id = 79933459\n# AND f.crm_provider_id = 'hs_activity_type';\n\n\nSELECT * FROM activity_messages;\nselect * from text_relays where created_at > '2026-05-01';\nselect * from activities where user_id IN (7160, 18608) and created_at > '2026-05-22' order by id desc;\nselect * from users where team_id = 1 and id IN (18608, 13934, 7160);\nselect * from activities where user_id = 7160 order by id desc limit 10;\n\nselect * from accounts where team_id = 1 and name = 'Column5';\n\nselect * from users where name like '%Subra%'; # 31054, 1117\nselect * from teams where id = 1117;\nselect * from activity_searches where user_id = 31054;\nselect * from activity_search_filters where activity_search_id IN (88882, 88902);","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}]...
|
4911831517688950861
|
-6520523836328617179
|
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
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(...
|
85763
|
NULL
|
NULL
|
NULL
|
|
85765
|
2941
|
6
|
2026-05-28T13:08:33.216594+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973713216_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomViewCoocWindowFV faVsco.s ~#12121 on JY-209 rapstomViewCoocWindowFV faVsco.s ~#12121 on JY-20963-fx-inwnapers.oh©ActivityControlier.php=custom.loglaravel.logA SF fiminny@localhost)HS Jocal (jiminny(blocalhost)& console (PROD) Xuewholeooserver.ono Tesmuonsc) eienupnpA console [STAGING>E HubspolE InicaradonAdeTX Autow>E Listener:INTERVAL 38 DAY.class ServiceTest extends TestCasebY 0.20u.caszlBY sns count DESCu.name u.sotcphone nunbenv saestorch> D FieldsOpoorunityMatcherOpportunitvSvncStrate26372638s-Saccentlor.matscesu.r-17-783E782* fron ceans where 20 =1Sthis->assertLessThan0rEqual( maximum: 25, strlen(Sresult)):2648• ProspectsearchStrategServicet raits©elientrest.php© DecorateActivityTest.p 2043po ated, oestn tteshublic function testParseContactMob{leWlithCountryCode: voicSservaee - sunasosgerseracenocklshScreData = "MobilePhone' => *0791112345691#NCATU.nd, CASE WHEN UINdETOUNerd THEN ouner" EsE END AS userd© FieldDetinitionsTest.phCCeTcwmaet ame#i PavtoadRuilderTest.ohehut nvokernVethttnodmethodName: "parseContactMobile', Sservice. ('GB", Scrabatallormen fo FRil soctal accnuntssa"Quer Rt dertest nhnQuervHandierTast ooduSoassenorOrKorURsers u on u.1d = sa.soclable_1cPargTncaontd n.teandOuerviteratorTast mhouseassenornnestor swth acheteessukeu.tean_1d = 1117 and sa.provider = "hubspot":*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES© QueryResultsTests.phpc Semcetescons© SyncBatchRedisServickRacASanicatast obo*EROM actM tes WHEOF mund to binl:255208/3-800/-1781-0276.66648288185c01= Musde 80186192 M0public functiion testinport@pportunitySkiosilhenProfileNotFoundO: voidf...;4 lof2odtd*EROM eon confaurazons WHERF 3d = 1953%* FROM teans WHERE id = 1117:+Eoon ucene whene 3d= 30240.Changes 5 filesE.env.local apc© JiminnyDebugCommand.php app/Console/Commands1L P +→ Side-by-side viewer -8 41e8c6bS tests/Unit/Services/Cpe loagina.ono contia@ PlaybackService.pho app/ServicesSresult & sereinvokeenivatekethodd parsetontactPhone'. Sseruice, Scountnydode. Seonintatbl• Salesforceservicelest.phpyUnversioned Filce 9 ficdE.enw.nikilocal andclass Servicelest extends Testlase: |Tests|Unit|Services|Crn|SailesforcelServiceTestpublic static fueenw.other aog@ GanAccossA ReporteTest.oho teste/Unit/PoliciosSource: /Users/lukas/jiminny/app/tests/Unit/Services/Crm/Salesforce/ServiceTest.phpreturnCreateWock.skiminny?eootcecteommandlohoang/consa.elcommandsln=> 'MobilePhone' a>tu favicon.ico public=iktyandR.raw.sal.querv.sol.aoolEconuind e CihtersnotComudAoMAAWENdS mulateWebhookscommand.oho.ano/.Concole/Commandis/crm/HubsootM. WERHOOK FILTFRING IMDIFMENTATION md anrSresult = self::invokePrivateMethod("parseContactMobile', Sservice. [ScountryCode, ScrnDatal)Sthis-›assertSame(Sexpected, Sresult)ouobzc tuncczon cesc.noor.uppor.unzcyskzoswhenrrorztenocround: vozd# console fiaum045 A1 A41 У 66 4TO0У L7ind co mey to.uorssServiceTesteeendhles orchwerwicee+0.destsrunxes drvkees/arm/S bestore Servtcer/st.php -f itervetest/brsecontact' 2562PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelouratciontnore/tinnyl ohounx"11/ 11 (100%Тдоe: 00:10.908, Меnогy: 60.00 мбAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha ull Saruf caTast to contim nothida is brokaa.vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.RuntrOHp SH1RlA ARoNecantalll+ < Code$AdaptiveotterencePurtent vereionSresult = self::invokePrivateMethod"parseContactPhone', Sservice, [ScountryCode, Scrmbata)):SthisobassentSane Sexoected, Sresulaspublic function testParseContactPhoneWithValidNumberO: voidSservice = Sthis->getServiceMockO:ScrmData = "Phone' a>*[PHONE]')#SparsedNumber, Sext) = self::invokePrivatelethod("parseContactPhone', Sservice, null, ScraData):Sthis->assertArrayHasKey("phone'. SparsedNumber):Scnis->assertsane [PHONE] S08rsechunberpnone ohSthis->assertNull(Sext):oublie funetzion testPanseContactPhonellithExtensiionde voiaRemoe hise>odSeWCOCkOSoreData = f'Phone* => *[PHONE] cxt. 42'1.fSoansedMunber. Soxtl = self.sinvokePoivatckethod("nansefontactPhone" Sservice. F'US'. Sccelatal):W Windsurf Teams 2643:6 UTF-8 4 space-...
|
NULL
|
3848793598643661916
|
NULL
|
visual_change
|
ocr
|
NULL
|
rapstomViewCoocWindowFV faVsco.s ~#12121 on JY-209 rapstomViewCoocWindowFV faVsco.s ~#12121 on JY-20963-fx-inwnapers.oh©ActivityControlier.php=custom.loglaravel.logA SF fiminny@localhost)HS Jocal (jiminny(blocalhost)& console (PROD) Xuewholeooserver.ono Tesmuonsc) eienupnpA console [STAGING>E HubspolE InicaradonAdeTX Autow>E Listener:INTERVAL 38 DAY.class ServiceTest extends TestCasebY 0.20u.caszlBY sns count DESCu.name u.sotcphone nunbenv saestorch> D FieldsOpoorunityMatcherOpportunitvSvncStrate26372638s-Saccentlor.matscesu.r-17-783E782* fron ceans where 20 =1Sthis->assertLessThan0rEqual( maximum: 25, strlen(Sresult)):2648• ProspectsearchStrategServicet raits©elientrest.php© DecorateActivityTest.p 2043po ated, oestn tteshublic function testParseContactMob{leWlithCountryCode: voicSservaee - sunasosgerseracenocklshScreData = "MobilePhone' => *0791112345691#NCATU.nd, CASE WHEN UINdETOUNerd THEN ouner" EsE END AS userd© FieldDetinitionsTest.phCCeTcwmaet ame#i PavtoadRuilderTest.ohehut nvokernVethttnodmethodName: "parseContactMobile', Sservice. ('GB", Scrabatallormen fo FRil soctal accnuntssa"Quer Rt dertest nhnQuervHandierTast ooduSoassenorOrKorURsers u on u.1d = sa.soclable_1cPargTncaontd n.teandOuerviteratorTast mhouseassenornnestor swth acheteessukeu.tean_1d = 1117 and sa.provider = "hubspot":*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES© QueryResultsTests.phpc Semcetescons© SyncBatchRedisServickRacASanicatast obo*EROM actM tes WHEOF mund to binl:255208/3-800/-1781-0276.66648288185c01= Musde 80186192 M0public functiion testinport@pportunitySkiosilhenProfileNotFoundO: voidf...;4 lof2odtd*EROM eon confaurazons WHERF 3d = 1953%* FROM teans WHERE id = 1117:+Eoon ucene whene 3d= 30240.Changes 5 filesE.env.local apc© JiminnyDebugCommand.php app/Console/Commands1L P +→ Side-by-side viewer -8 41e8c6bS tests/Unit/Services/Cpe loagina.ono contia@ PlaybackService.pho app/ServicesSresult & sereinvokeenivatekethodd parsetontactPhone'. Sseruice, Scountnydode. Seonintatbl• Salesforceservicelest.phpyUnversioned Filce 9 ficdE.enw.nikilocal andclass Servicelest extends Testlase: |Tests|Unit|Services|Crn|SailesforcelServiceTestpublic static fueenw.other aog@ GanAccossA ReporteTest.oho teste/Unit/PoliciosSource: /Users/lukas/jiminny/app/tests/Unit/Services/Crm/Salesforce/ServiceTest.phpreturnCreateWock.skiminny?eootcecteommandlohoang/consa.elcommandsln=> 'MobilePhone' a>tu favicon.ico public=iktyandR.raw.sal.querv.sol.aoolEconuind e CihtersnotComudAoMAAWENdS mulateWebhookscommand.oho.ano/.Concole/Commandis/crm/HubsootM. WERHOOK FILTFRING IMDIFMENTATION md anrSresult = self::invokePrivateMethod("parseContactMobile', Sservice. [ScountryCode, ScrnDatal)Sthis-›assertSame(Sexpected, Sresult)ouobzc tuncczon cesc.noor.uppor.unzcyskzoswhenrrorztenocround: vozd# console fiaum045 A1 A41 У 66 4TO0У L7ind co mey to.uorssServiceTesteeendhles orchwerwicee+0.destsrunxes drvkees/arm/S bestore Servtcer/st.php -f itervetest/brsecontact' 2562PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelouratciontnore/tinnyl ohounx"11/ 11 (100%Тдоe: 00:10.908, Меnогy: 60.00 мбAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha ull Saruf caTast to contim nothida is brokaa.vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.RuntrOHp SH1RlA ARoNecantalll+ < Code$AdaptiveotterencePurtent vereionSresult = self::invokePrivateMethod"parseContactPhone', Sservice, [ScountryCode, Scrmbata)):SthisobassentSane Sexoected, Sresulaspublic function testParseContactPhoneWithValidNumberO: voidSservice = Sthis->getServiceMockO:ScrmData = "Phone' a>*[PHONE]')#SparsedNumber, Sext) = self::invokePrivatelethod("parseContactPhone', Sservice, null, ScraData):Sthis->assertArrayHasKey("phone'. SparsedNumber):Scnis->assertsane [PHONE] S08rsechunberpnone ohSthis->assertNull(Sext):oublie funetzion testPanseContactPhonellithExtensiionde voiaRemoe hise>odSeWCOCkOSoreData = f'Phone* => *[PHONE] cxt. 42'1.fSoansedMunber. Soxtl = self.sinvokePoivatckethod("nansefontactPhone" Sservice. F'US'. Sccelatal):W Windsurf Teams 2643:6 UTF-8 4 space-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85764
|
2941
|
5
|
2026-05-28T13:08:23.829242+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973703829_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormvewNeweNNCCoocWindowFV faVsco.|s ~#12121 o PhpStormvewNeweNNCCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-inwnapers.oh©ActivityControlier.phpuewholeooserver.ono Tesmuonsc) eienupnp>E HubspolE IntcaratonAoe>E Listener:class ServiceTest extends TestCasev saestorch› E FieldsOpoorunityMatcherOpportunitvSvncStrate26372638s-Saccentlor.matscesu.rSthis->assertLessThan0rEqual( maximum: 25, strlen(Sresult)):2648› ProspectsearchStrategServicetraits©elientrest.php© DecorateActivityTest.p 2643po ated, oestn tteshublic function testParseContactMob{leWlithCountryCode: voicSservaee - sunasosgerseracenocklshScreData = "MobilePhone' => *0791112345691#© FieldDetinitionsTest.phCCeTcwmaet ame#i PavtoadRuilderTest.ohehut nvokernVethttnod"parseContactMobile', Sservice. ('GB", Scrabatal"Quer Rt dertest nhnQuervHandierTast ooduSoassenorOrKorUROuerviteratorTast mhousorassenorn hostar s thl ecuetewssune© QueryResultsTests.php© ServiceTest.php© SyncBatchRedisServickRacASanicatast obopublic functiion testinport@pportunitySkiosilhenProfileNotFoundO: voidi...:4 lof2odtdXReM F OXG• Changes 5 files, updating*^L+→f Side-by-side viewer -841e8c6b5 tests/Unit/ServiceDo not ignore"© JiminnyDebugCommand.php app/Console/CommandsCnocnllt o ColtinuAhoon ustolothadld nancorantadtohano"pe loagina.ono contia@ PlaybackService.pho app/ServicesSthis-›assertSame(Sexpected, Sresulte servicetestonoyUnversioned filce 9 flas, uodatina.E.enw.nikilocal.aodpublic static function parseContactMobileProvider@: arrayeenw.other aog@ GanAccossA ReporteTest.oho teste/Unit/Policiosreturn ienocy hoozlernone recurns null'=> (['MobilePhone' => **1. null, nulz]createWlock.skiminny?eoot?ecteommandlonoaog/conso.e/commandsintu favicon.ico publicsldk.yandR.raw.sal.querv.sol.aoolaserynoae tniooesernechockioS mulateWebhookscommand.oho.ano/Concole/Commandis/Crm/Hubsoottresulsser.nvoke?owrche.hooldparertontcicrhooktrsenutce.countnweooe.scomihcl1sSthisonssentSane(Scxoccted, Sresult):M. WERHOOK FILTFRING IMDIFMENTATION md anrnunide tuncciontesairhor tonortunsysk nswhenProror ellor Soundioie wose=custom.logaraveuesA SF fiminny@localhost)HS Jocal (jminny@localhost)A console [STAGING17781TX AutowINTERVAL 38 DAYXbY 0.20u.caszlBY sns count DESCu.name,u.sorcphonenuaben* fron ceans where 20 =1& console (PROD) X# console fiaum045 A1 A41 У 66 4NCATCu,id. CASE WHEN u.id = thouner_id THEN • (oaner)* ELSE ** END) AS user_idormen fo FRil soctal accnuntssasers u on u.1d = sa.soclable_1cParGTnCoontd n.teandu.tean_1d = 1117 and sa.provider = "hubspot":*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES*EROM actM tes WHEOF mund to binl:255208/3-800/-1781-0276.66648288185c01= Musde 80186192 M0*EROM eon confaurazons MHEPF 3d = 1953%* FROM teans WHERE id = 1117:+Eoon licene whene a= 30240.X1€?Casuntaubadd CAnnhAtOYNTO0У L7inu co moy to.voiServiceTesteeendhles orchwerwicee+0.destsrunxes drvkees/arm/S bestore Servtcer/st.php -f itervetest/brsecontact' 2562PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelouratciontnore/tinnyl ohounx"11/ 11 (100%Tase: 00:20.908, Menory: 60.00 мbAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aico ar'cklv nin tha mil SarufcaTast to contimm nothioo ie beokaa.vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.OHp SH1RlA ARoNecant alll+ < Code$AdaptiveotterencePurtent vereionnuhibictunctaion testParsecontactPhonelchValsidkunber.orwosdSservice = Sthis-›getServiceMock@:ScrmData = ['Phone' => *[PHONE]*]SparsedNumber, Sext) = self::invokePrivateMethod("parseContactPhone', Sservice, null, ScrnData):Sthis->assertArrayHasKey("phone', SparsedNumber)Sthis->assentSane(*[PHONE]', SparsedNumber i"phone'):SihlorsoodontMmn(Cout)public function testParseContactPhoneWithExtension: voidSservice = Sthis->getServiceMockO=SoneData = f'Phone" =>*[PHONE] ext. 42'1.fSoansedNunben. Sextl = self:sinvokePoivatekethod("pansetontactPhone" Sservice, F'US' SccelatabeSthis->assertArrayHaskey("phone", Sparsedwunber)hsosnsser SanelW seyoixed = nuli), [value: mixed = null), [boolean: string = 'and)]KModturThsmerkerwhiest4 space...
|
NULL
|
-2102957735126746291
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormvewNeweNNCCoocWindowFV faVsco.|s ~#12121 o PhpStormvewNeweNNCCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-inwnapers.oh©ActivityControlier.phpuewholeooserver.ono Tesmuonsc) eienupnp>E HubspolE IntcaratonAoe>E Listener:class ServiceTest extends TestCasev saestorch› E FieldsOpoorunityMatcherOpportunitvSvncStrate26372638s-Saccentlor.matscesu.rSthis->assertLessThan0rEqual( maximum: 25, strlen(Sresult)):2648› ProspectsearchStrategServicetraits©elientrest.php© DecorateActivityTest.p 2643po ated, oestn tteshublic function testParseContactMob{leWlithCountryCode: voicSservaee - sunasosgerseracenocklshScreData = "MobilePhone' => *0791112345691#© FieldDetinitionsTest.phCCeTcwmaet ame#i PavtoadRuilderTest.ohehut nvokernVethttnod"parseContactMobile', Sservice. ('GB", Scrabatal"Quer Rt dertest nhnQuervHandierTast ooduSoassenorOrKorUROuerviteratorTast mhousorassenorn hostar s thl ecuetewssune© QueryResultsTests.php© ServiceTest.php© SyncBatchRedisServickRacASanicatast obopublic functiion testinport@pportunitySkiosilhenProfileNotFoundO: voidi...:4 lof2odtdXReM F OXG• Changes 5 files, updating*^L+→f Side-by-side viewer -841e8c6b5 tests/Unit/ServiceDo not ignore"© JiminnyDebugCommand.php app/Console/CommandsCnocnllt o ColtinuAhoon ustolothadld nancorantadtohano"pe loagina.ono contia@ PlaybackService.pho app/ServicesSthis-›assertSame(Sexpected, Sresulte servicetestonoyUnversioned filce 9 flas, uodatina.E.enw.nikilocal.aodpublic static function parseContactMobileProvider@: arrayeenw.other aog@ GanAccossA ReporteTest.oho teste/Unit/Policiosreturn ienocy hoozlernone recurns null'=> (['MobilePhone' => **1. null, nulz]createWlock.skiminny?eoot?ecteommandlonoaog/conso.e/commandsintu favicon.ico publicsldk.yandR.raw.sal.querv.sol.aoolaserynoae tniooesernechockioS mulateWebhookscommand.oho.ano/Concole/Commandis/Crm/Hubsoottresulsser.nvoke?owrche.hooldparertontcicrhooktrsenutce.countnweooe.scomihcl1sSthisonssentSane(Scxoccted, Sresult):M. WERHOOK FILTFRING IMDIFMENTATION md anrnunide tuncciontesairhor tonortunsysk nswhenProror ellor Soundioie wose=custom.logaraveuesA SF fiminny@localhost)HS Jocal (jminny@localhost)A console [STAGING17781TX AutowINTERVAL 38 DAYXbY 0.20u.caszlBY sns count DESCu.name,u.sorcphonenuaben* fron ceans where 20 =1& console (PROD) X# console fiaum045 A1 A41 У 66 4NCATCu,id. CASE WHEN u.id = thouner_id THEN • (oaner)* ELSE ** END) AS user_idormen fo FRil soctal accnuntssasers u on u.1d = sa.soclable_1cParGTnCoontd n.teandu.tean_1d = 1117 and sa.provider = "hubspot":*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES*EROM actM tes WHEOF mund to binl:255208/3-800/-1781-0276.66648288185c01= Musde 80186192 M0*EROM eon confaurazons MHEPF 3d = 1953%* FROM teans WHERE id = 1117:+Eoon licene whene a= 30240.X1€?Casuntaubadd CAnnhAtOYNTO0У L7inu co moy to.voiServiceTesteeendhles orchwerwicee+0.destsrunxes drvkees/arm/S bestore Servtcer/st.php -f itervetest/brsecontact' 2562PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelouratciontnore/tinnyl ohounx"11/ 11 (100%Tase: 00:20.908, Menory: 60.00 мbAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aico ar'cklv nin tha mil SarufcaTast to contimm nothioo ie beokaa.vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.OHp SH1RlA ARoNecant alll+ < Code$AdaptiveotterencePurtent vereionnuhibictunctaion testParsecontactPhonelchValsidkunber.orwosdSservice = Sthis-›getServiceMock@:ScrmData = ['Phone' => *[PHONE]*]SparsedNumber, Sext) = self::invokePrivateMethod("parseContactPhone', Sservice, null, ScrnData):Sthis->assertArrayHasKey("phone', SparsedNumber)Sthis->assentSane(*[PHONE]', SparsedNumber i"phone'):SihlorsoodontMmn(Cout)public function testParseContactPhoneWithExtension: voidSservice = Sthis->getServiceMockO=SoneData = f'Phone" =>*[PHONE] ext. 42'1.fSoansedNunben. Sextl = self:sinvokePoivatekethod("pansetontactPhone" Sservice, F'US' SccelatabeSthis->assertArrayHaskey("phone", Sparsedwunber)hsosnsser SanelW seyoixed = nuli), [value: mixed = null), [boolean: string = 'and)]KModturThsmerkerwhiest4 space...
|
85762
|
NULL
|
NULL
|
NULL
|
|
85763
|
2940
|
6
|
2026-05-28T13:08:21.822218+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973701822_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowH iTerm2ShellEditViewSessionScriptsProfilesWindowHelplda]-zshDOCKER881DEV (docker)₴82-zshscreenpipe"O ₴4-zshcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug forseamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddocker exec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image + docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfixdocker exec -it docker_lamp_1•/vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.5.5Loaded config default from ".php-cs-fixer.dist.php".Running analysis on 7 cores with 10 files per process.5697/5697 C8I 100%85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:08:21181ec2-user@ip-10-30-140-…₴7Fixed 0 of 5697 files in 67.976 seconds, 799.06 MBmemory usedDetected deprecations in use (they will stop working in next major release):- Rule set"@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x®Migration" instead.- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.- Ruleset "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $I...
|
NULL
|
-3868733436735219594
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowH iTerm2ShellEditViewSessionScriptsProfilesWindowHelplda]-zshDOCKER881DEV (docker)₴82-zshscreenpipe"O ₴4-zshcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug forseamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddocker exec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image + docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfixdocker exec -it docker_lamp_1•/vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.5.5Loaded config default from ".php-cs-fixer.dist.php".Running analysis on 7 cores with 10 files per process.5697/5697 C8I 100%85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:08:21181ec2-user@ip-10-30-140-…₴7Fixed 0 of 5697 files in 67.976 seconds, 799.06 MBmemory usedDetected deprecations in use (they will stop working in next major release):- Rule set"@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x®Migration" instead.- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.- Ruleset "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $I...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85762
|
2941
|
4
|
2026-05-28T13:08:20.245763+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973700245_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
Built-in Preview
Chrome
Firefox
Safari...
|
[{"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","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":"Built-in Preview","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":"Chrome","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":"Firefox","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":"Safari","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}]...
|
8099280038376358662
|
-9066624220847174716
|
visual_change
|
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
Built-in Preview
Chrome
Firefox
Safari
PhpStormViewNeweNNCCodeKelucioWindowFV faVsco.|s ~#12121 on JY-20963-fx-lproideteSarvicc.ohhe bolbees.phe©ActivityControlier.php• HttpIntegrationsnlinteractionsuserRo cobserver.onC) Team.phpo Nemeuoni(© Client.phpJobsclass ServiceTest extends TestCasepubuzc tunccion cescrarseconcacchoozle struncaredlozstnars. vorea MailiModelo2637s-Saccentlor.matscesu.r0 Notifications2639voseivers2648© SocialAccountobservertescy 2641UserObserverTest.phpUserRoleObserverTest.pho(tn Policies2643Sthis->assertLessThan0rEqual( maximum: 25, strlen(Sresult)):ouhke function tactPanseContactMohflelkthCounteufodeme wosaa Providerla RepositoriesSservaee - sunasosgerseracenocklshScreData = "MobilePhone' => *0791112345691#E Ruc.Ea Services2649264626472649hut nvokernVethttnod"parseContactMobile', Sservice. ('GB", Scrabatal>EACtVIYha ActivityProvidersuSoassenorOrKorUR2650uu sorassenorw nostar wothitechus@ Calendarleonterence2652public functiion testinport@pportunitySkiosilhenProfileNotFoundO: voidi...:a erm→Rulihor"lot2edtChanges 5 filesE.env.local apc© JiminnyDebugCommand.php app/Console/CommandsT+ 0 +→0 Side-by-side viewer -@ 41e8c6bS app/Services/PlaybackService.phpDo not ignore"Highlight words -x15€pe loagina.ono contia© Paybickservice.ono apo servicee@ ServiceTest.pho tests/Unit/Services/Crm/SalesforceStean & Stracko>oe Activitye ->oetUser Or>aetteam oryUnversoncd SiloesneE.enw.nikilocal andE enw.other and@ GanAccossA ReporteTest.oho teste/Unit/PoliciosEnumonsto and doloto l connonteforeach (Splaylist "mediaSegnents') as Ssegment) ?Ssegment ""uri' = client cdn(Ssegnent ("uri'), Stean):(c ereate lock.sk iminny ?eoot cest eommandlono angfeonsa elcommandslntu favicon.ico publicsldk.yandR.raw.sol.querv.sol aodSplayList ("EXT-X-PLAYLIST-TYPE' = 'VOD'ASplayList (*EXT-X-ENDLIST' = true:S mulateWebhookscommand.oho.ano/.Concole/Commandis/crm/HubsootM.WERHOOK FILTERING. IMPIFMENTATION md and=custom.logaraveuesA SF fiminny@localhost)& console (PROD) XA console [STAGINGTX AutowINTERVAL 38 DAY.bY 0.20u.caszl17781BY sns count DESC* fron ceans where 20 =1NCATCu,id. CASE WHEN u.id = thouner_id THEN • (oaner)* ELSE ** END) AS user_idena1aormen fo FRil soctal accnuntssasers u on u.1d = sa.soclable_1cPargTncaontd n.teandu.tean_1d = 1117 and sa.provider = "hubspot":*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES*EROM ActM tes WHEOF muhd to binl:255208/3-800/-1781-0276.66648288185c01= musde 80186192 M0* EROM eon confqurazons MHERF 3d = 1953%* FROM teans WHERE id = 1117:+Eoon usene whene3d=30240.# console fiaum8458185Y00TO0У L7Inu co moy to.voilServiceTesteeendhles orchwerwicee+0.destsrunxes drvkees/arm/S bestore Servtcer/st.php -f itervetest/brsecontact' 2562PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelourarcion.Tno.e/uminnyl chounx=11/ 11 (100%Тдоe: 00:10.908, Меnогy: 60.00 мбAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aico ar'cklv nin tha mil SarufcaTast to contimm nothioo ie beokaa.vendor/bin/phpuniPHPUnzt 11.5.55 by Sebastzan Beramann and contributors.RuntrOHp SH1RlA ARoNecant alll+ < Code§ AdaptiveditterencePurtent vereionyServices> PaybackService > cenerateMedaPiiAAAAASteam = Strack->aetActvitylor>aerlser Oo>oeteaniobEnumerate and delete all segments.foreach (Splaylist 'mediaSegments' as Ssegment)Ssegnent ("uri') = client con(Ssegment("uri', Stean):SplayList("EXT-X-PLAYLIST-TYPE') = *VOD*:SplayList("EXT-X-ENDLIST') = true:N Wodtur Teams DRARR UTE-R AIA enano...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85761
|
2940
|
5
|
2026-05-28T13:08:17.554164+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973697554_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplda]-zshDOCKER881DEV (docker)₴82-zshscreenpipe"84-zshcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug forseamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddocker exec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image + docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfixdocker exec -it docker_lamp_1•/vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.5.5Loaded config default from ".php-cs-fixer.dist.php".Running analysis on 7 cores with 10 files per process.5697/5697 C8I 100%X5ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:08:17181ec2-user@ip-10-30-140-…₴7Fixed 0 of 5697 files in 67.976 seconds, 799.06 MBmemory usedDetected deprecations in use (they will stop working in next major release):- Rule set"@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x®Migration" instead.- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.- Ruleset "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $I...
|
NULL
|
8676314557043534403
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplda]-zshDOCKER881DEV (docker)₴82-zshscreenpipe"84-zshcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug forseamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddocker exec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image + docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfixdocker exec -it docker_lamp_1•/vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.5.5Loaded config default from ".php-cs-fixer.dist.php".Running analysis on 7 cores with 10 files per process.5697/5697 C8I 100%X5ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:08:17181ec2-user@ip-10-30-140-…₴7Fixed 0 of 5697 files in 67.976 seconds, 799.06 MBmemory usedDetected deprecations in use (they will stop working in next major release):- Rule set"@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x®Migration" instead.- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.- Ruleset "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $I...
|
85759
|
NULL
|
NULL
|
NULL
|
|
85760
|
2941
|
3
|
2026-05-28T13:08:14.359638+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973694359_m2.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rnostolFV faVsco.is ~#12121 on JY-20963-fix-imecan rnostolFV faVsco.is ~#12121 on JY-20963-fix-imecanyice pn.he bolbees.phe©ActivityControlier.php=custom.loglaravel.logA SF fiminny@localhost)HSJocal (jiminny@blocalhost)console (PROD) X• HttpIntegrationslinteractionsJobshwioDonciwcr.onyTeom.oneo Nemeuonic) eienupnpA console (STAGING)2019class ServiceTest extends TestCasepublic function testParseContactMobileWithValidNumberO: voidAccept keneck781a Maili ModeleNotificationsSresult = seLf::javokePetvateMethod( methodName: "parseContactMobite", Sservice, (null, ScraData))79voseiversSocialAccountOoserverlestUserObserverTest.phpUserRoleObserverTest.phoPolciesthts-sassertNorultSresultSthisesassentSanet exoected)2629public function testParsecontactHob1lelstruncatedtoz5chars: vo1d788=70926322635SseruiceThisosoerSenys celockio=7?>EACtVIYla ActivityProvider:SLongNumber = [PHONE]3456789812348Sermlata = T"MobslePhone" = Sonollucheni CalendarTeonterencoa erm•Rullmeen& Closealeonne C=724Sresult = self::invokePrivateMethod( methodName: "parseContactMobile', Sservice, [nutt, ScreDatal): 713716Wthss-SaccentMotMullScesult—717—71m: 25, strlen(Sresult)):public function testParseContactMobfleWithCountryCode@: void2644Ti HelnersMi HibsootD IntegrationApplllistenars264626472649Pipedrive(D Salesforce• (b FieldsD OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.o( DeleteObiocts TraitTest 2724anhnafniioastestoh© GetActivitvFieldNameT 2726 0>PavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohthis-sassertNotNulSresulosthis-yassertStringstartsittheprehc"+44 Sresuitopublic functsion testinoort0pportunitvSkiosllhenProfileNotFoundO= voidi....Cass Has"envsytanded ayrends Hastentpublic function wheredl...public function firstot...=722HHNI H729730731TIIIFIGERELERC Semceltestoo@*SuncRatchRedicSenicsTdeclaratlon.mustthe.comoatible.withT:uiideros.where//columowarrav/iTelosureliTiuminate.lcontracisToatabaselOuerylsxocecc.onl/atioa/ooerator.mixed=.nulllvaluexm/xedirnuhl/booleanssmioa-=JaochMndcud: SynaineEy 101Ty: AutowINTERVAL 38 DAY.by 0.z0, u.caszlu.name,u.sorcphonenuabenBY sns count DESC* fron ceans where 20 =1NCAT(u.id, CASE WHEN u.id = t.ouner_id THEN • (ouner)' ELSE ** END) AS user_idouner_1d FROh soclal,accounts sasers u on v.id e sa.sociable_ideans t.nc->1Sontd M.teandu.tean_id = 1117 and sa.provider = 'hubspot':*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES* FROM activities WHERE uuid_to_bin('[CREDIT_CARD]-927f-4f4da2a8185c') = uuid; # 80186192 NQ*EROM eon confauratzons WHERE 3d = 1953%* FROM teans WHERE id = 1117;+Eoon licene whene a= 30240.* fron playbooks where id = 5473;* fron playbook categonies where id = 43783:* fron playbook categories where playbook_id = 5473:*Eoon enn ffalde whons 4d = 450242.* fron cra field values where crn_field_id = 659242:* FROM crn_field_data fdcrn_fields f ON fd.crm_field_id = f.idactivities a ON fd.activity id = a.idactivity_id = 79933459f.crn_provider-_id = 'hs_activity type'* FROM activity_messages;* Fron text rellavs where created.ar > 2826-85-8* fron actsivities where user_id TN (7168, 18688) and created at > *2826-85-22' order by sid desc* fron users where team id = 1 and id TN (18688, 13934. 7169)=*£ron activities where usen 1a = 7169 order bu ja desc 1ini+ 19.* Eron accounts whene tear oe and nane wollenseToon tasne whanda4* fron activity_searches where user_id = 31854)*Eoon sctkusty coanch filitane nhans sctfusty conoch SA TM CARRR2 RRO02# console fiaum8458185Y0000% L7o Inu co moy 1o.Uo.leServiceTestveeendhles orchwerwicee+0.testsruexec dovkers/crm/3 bestore 5e/vicer/stmphpy - iterwenest/brseContact' 2561PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelouratciontnore/tinnyl ohounx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha ull Saruf caTast to contim nothida is brokaa.o desterexts deckee/er/3 lestoreServiceestephg 5 P ven -2/bin/phpunstPHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Confiquration:/home/siminny/phpunit.xmD.•DODOD...[PASSWORD_DOTS]0000.00......•. 65 / 73 ( 894TIeA: 80.2 70 MARAPus OA 1a0 MpA.7s tests pass. Herc's a summary of what was added:oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths — added 7newssanrsctontact phostestParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?"esParsccontad Phonewnextens ton -moerwihler ucotttoyerracthe orensottastpareacontsctPhanafytictruncatetto10charc=sytwttlanowthom.th/chhre.ootethindstodltGtruehtaetbareacontnetPhondthrountrtodestocallkoim.ttheo.watowmeine.cotntrv.conparseContactMobiletestparsctonthe wontethaldwuher- Eo numoeteturnd noetActPAreAGontcMahsnTetrunestMhT/20Ghhre-Mimawtlwaw than.2fchare note thinastorlGtrehedtACtOsrcAGAnt.CMAKSlWWAthGAuAtCUCAA.FTAAITIKmANATMeALItAr/mcima.AMintrv.chGunl-1tile +80 2Acceot allAsk anything (XOL)" PodnAdhotvuwodtur TeimswohesP4 s...
|
NULL
|
-3393742965811787464
|
NULL
|
click
|
ocr
|
NULL
|
rnostolFV faVsco.is ~#12121 on JY-20963-fix-imecan rnostolFV faVsco.is ~#12121 on JY-20963-fix-imecanyice pn.he bolbees.phe©ActivityControlier.php=custom.loglaravel.logA SF fiminny@localhost)HSJocal (jiminny@blocalhost)console (PROD) X• HttpIntegrationslinteractionsJobshwioDonciwcr.onyTeom.oneo Nemeuonic) eienupnpA console (STAGING)2019class ServiceTest extends TestCasepublic function testParseContactMobileWithValidNumberO: voidAccept keneck781a Maili ModeleNotificationsSresult = seLf::javokePetvateMethod( methodName: "parseContactMobite", Sservice, (null, ScraData))79voseiversSocialAccountOoserverlestUserObserverTest.phpUserRoleObserverTest.phoPolciesthts-sassertNorultSresultSthisesassentSanet exoected)2629public function testParsecontactHob1lelstruncatedtoz5chars: vo1d788=70926322635SseruiceThisosoerSenys celockio=7?>EACtVIYla ActivityProvider:SLongNumber = [PHONE]3456789812348Sermlata = T"MobslePhone" = Sonollucheni CalendarTeonterencoa erm•Rullmeen& Closealeonne C=724Sresult = self::invokePrivateMethod( methodName: "parseContactMobile', Sservice, [nutt, ScreDatal): 713716Wthss-SaccentMotMullScesult—717—71m: 25, strlen(Sresult)):public function testParseContactMobfleWithCountryCode@: void2644Ti HelnersMi HibsootD IntegrationApplllistenars264626472649Pipedrive(D Salesforce• (b FieldsD OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.o( DeleteObiocts TraitTest 2724anhnafniioastestoh© GetActivitvFieldNameT 2726 0>PavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohthis-sassertNotNulSresulosthis-yassertStringstartsittheprehc"+44 Sresuitopublic functsion testinoort0pportunitvSkiosllhenProfileNotFoundO= voidi....Cass Has"envsytanded ayrends Hastentpublic function wheredl...public function firstot...=722HHNI H729730731TIIIFIGERELERC Semceltestoo@*SuncRatchRedicSenicsTdeclaratlon.mustthe.comoatible.withT:uiideros.where//columowarrav/iTelosureliTiuminate.lcontracisToatabaselOuerylsxocecc.onl/atioa/ooerator.mixed=.nulllvaluexm/xedirnuhl/booleanssmioa-=JaochMndcud: SynaineEy 101Ty: AutowINTERVAL 38 DAY.by 0.z0, u.caszlu.name,u.sorcphonenuabenBY sns count DESC* fron ceans where 20 =1NCAT(u.id, CASE WHEN u.id = t.ouner_id THEN • (ouner)' ELSE ** END) AS user_idouner_1d FROh soclal,accounts sasers u on v.id e sa.sociable_ideans t.nc->1Sontd M.teandu.tean_id = 1117 and sa.provider = 'hubspot':*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES* FROM activities WHERE uuid_to_bin('[CREDIT_CARD]-927f-4f4da2a8185c') = uuid; # 80186192 NQ*EROM eon confauratzons WHERE 3d = 1953%* FROM teans WHERE id = 1117;+Eoon licene whene a= 30240.* fron playbooks where id = 5473;* fron playbook categonies where id = 43783:* fron playbook categories where playbook_id = 5473:*Eoon enn ffalde whons 4d = 450242.* fron cra field values where crn_field_id = 659242:* FROM crn_field_data fdcrn_fields f ON fd.crm_field_id = f.idactivities a ON fd.activity id = a.idactivity_id = 79933459f.crn_provider-_id = 'hs_activity type'* FROM activity_messages;* Fron text rellavs where created.ar > 2826-85-8* fron actsivities where user_id TN (7168, 18688) and created at > *2826-85-22' order by sid desc* fron users where team id = 1 and id TN (18688, 13934. 7169)=*£ron activities where usen 1a = 7169 order bu ja desc 1ini+ 19.* Eron accounts whene tear oe and nane wollenseToon tasne whanda4* fron activity_searches where user_id = 31854)*Eoon sctkusty coanch filitane nhans sctfusty conoch SA TM CARRR2 RRO02# console fiaum8458185Y0000% L7o Inu co moy 1o.Uo.leServiceTestveeendhles orchwerwicee+0.testsruexec dovkers/crm/3 bestore 5e/vicer/stmphpy - iterwenest/brseContact' 2561PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelouratciontnore/tinnyl ohounx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha ull Saruf caTast to contim nothida is brokaa.o desterexts deckee/er/3 lestoreServiceestephg 5 P ven -2/bin/phpunstPHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Confiquration:/home/siminny/phpunit.xmD.•DODOD...[PASSWORD_DOTS]0000.00......•. 65 / 73 ( 894TIeA: 80.2 70 MARAPus OA 1a0 MpA.7s tests pass. Herc's a summary of what was added:oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths — added 7newssanrsctontact phostestParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?"esParsccontad Phonewnextens ton -moerwihler ucotttoyerracthe orensottastpareacontsctPhanafytictruncatetto10charc=sytwttlanowthom.th/chhre.ootethindstodltGtruehtaetbareacontnetPhondthrountrtodestocallkoim.ttheo.watowmeine.cotntrv.conparseContactMobiletestparsctonthe wontethaldwuher- Eo numoeteturnd noetActPAreAGontcMahsnTetrunestMhT/20Ghhre-Mimawtlwaw than.2fchare note thinastorlGtrehedtACtOsrcAGAnt.CMAKSlWWAthGAuAtCUCAA.FTAAITIKmANATMeALItAr/mcima.AMintrv.chGunl-1tile +80 2Acceot allAsk anything (XOL)" PodnAdhotvuwodtur TeimswohesP4 s...
|
85756
|
NULL
|
NULL
|
NULL
|
|
85759
|
2940
|
4
|
2026-05-28T13:08:14.248132+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973694248_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp•-zshDOCKER*- ₴1DEV (docker)₴2-zshscreenpipe"O &4-zshcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug forseamless, persistent debugging tools in any container or image → docker debug docker_1amp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddocker exec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image + docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfixdocker exec -it docker_lamp_1•/vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.5.5Loaded config default from ".php-cs-fixer.dist.php".Running analysis on 7 cores with 10 files per process.5697/5697 C8I 100%lool100% C4785ec2-user@ip-10-30-129-...8•Thu 28 May 16:08:14T81ec2-user@ip-10-30-140-….$7Fixed 0 of 5697 files in 67.976 seconds, 799.06 MBmemory usedDetected deprecations in use (they will stop working in next major release):- Rule set"@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x®Migration" instead.- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.- Ruleset "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $|...
|
NULL
|
3849177134263312770
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp•-zshDOCKER*- ₴1DEV (docker)₴2-zshscreenpipe"O &4-zshcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug forseamless, persistent debugging tools in any container or image → docker debug docker_1amp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddocker exec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image + docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfixdocker exec -it docker_lamp_1•/vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.5.5Loaded config default from ".php-cs-fixer.dist.php".Running analysis on 7 cores with 10 files per process.5697/5697 C8I 100%lool100% C4785ec2-user@ip-10-30-129-...8•Thu 28 May 16:08:14T81ec2-user@ip-10-30-140-….$7Fixed 0 of 5697 files in 67.976 seconds, 799.06 MBmemory usedDetected deprecations in use (they will stop working in next major release):- Rule set"@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x®Migration" instead.- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.- Ruleset "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $|...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85758
|
2940
|
3
|
2026-05-28T13:08:01.058766+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973681058_m1.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 67.976 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 67.976 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 67.976 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.00069444446,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0048611113,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.14131944,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14548612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.28194445,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28611112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.42256945,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42673612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.56319445,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5673611,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.7034722,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70763886,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.84375,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.84791666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95555556,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.48333332,"top":0.033333335,"width":0.034027778,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-5088919869347282197
|
-717300573596540707
|
visual_change
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 67.976 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] (-zsh)
Close Tab
⌥⌘1
docker...
|
85757
|
NULL
|
NULL
|
NULL
|
|
85757
|
2940
|
2
|
2026-05-28T13:07:52.385415+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973672385_m1.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5211/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░] 91%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5211/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░] 91%","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5211/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░] 91%","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.00069444446,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0048611113,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.14131944,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14548612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.28194445,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28611112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.42256945,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42673612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.56319445,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5673611,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.7034722,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70763886,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.84375,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.84791666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95555556,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.48333332,"top":0.033333335,"width":0.034027778,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
2530735175461682721
|
-717296381708197667
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5211/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░] 91%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85756
|
2941
|
2
|
2026-05-28T13:07:49.721076+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973669721_m2.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
4971/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░] 87%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 4971/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░] 87%","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 4971/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░] 87%","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2706117,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27260637,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.33793217,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33992687,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.40525267,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40724733,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.47257313,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.47456783,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5398936,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5418883,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.60704786,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6090425,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.67420214,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6761968,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.72772604,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.50166225,"top":1.0,"width":0.016289894,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8318666829009684843
|
-717300779754708771
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
4971/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░] 87%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85755
|
2940
|
1
|
2026-05-28T13:07:22.039248+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973642039_m1.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
3241/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 56%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 3241/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 56%","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 3241/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 56%","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.00069444446,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0048611113,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.14131944,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14548612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.28194445,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28611112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.42256945,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42673612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.56319445,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5673611,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.7034722,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70763886,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.84375,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.84791666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95555556,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.48333332,"top":0.033333335,"width":0.034027778,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-2505019350275993997
|
-717296106830552867
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
3241/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 56%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
85753
|
NULL
|
NULL
|
NULL
|
|
85754
|
2941
|
1
|
2026-05-28T13:07:19.343198+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973639343_m2.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
3081/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 54%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 3081/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 54%","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 3081/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 54%","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2706117,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27260637,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.33793217,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33992687,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.40525267,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40724733,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.47257313,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.47456783,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5398936,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5418883,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.60704786,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6090425,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.67420214,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6761968,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.72772604,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.50166225,"top":1.0,"width":0.016289894,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
9174238897488381193
|
-717296381708459815
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
3081/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░] 54%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
85749
|
NULL
|
NULL
|
NULL
|
|
85753
|
2940
|
0
|
2026-05-28T13:06:51.804441+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973611804_m1.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
0/5697 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 0/5697 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0%","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 0/5697 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0%","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.00069444446,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0048611113,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.14131944,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14548612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.28194445,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28611112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.42256945,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42673612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.56319445,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5673611,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.7034722,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70763886,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.84375,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.84791666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95555556,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.48333332,"top":0.033333335,"width":0.034027778,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4415304324739267858
|
-717296381708459811
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
0/5697 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0%
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85752
|
2941
|
0
|
2026-05-28T13:06:49.101392+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973609101_m2.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2706117,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27260637,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.33793217,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33992687,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.40525267,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40724733,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.47257313,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.47456783,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5398936,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5418883,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.60704786,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6090425,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.67420214,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6761968,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.72772604,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.50166225,"top":1.0,"width":0.016289894,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8330139256751037335
|
-717296106830290723
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
85749
|
NULL
|
NULL
|
NULL
|
|
85751
|
NULL
|
0
|
2026-05-28T13:06:18.830761+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973578830_m2.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2706117,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27260637,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.33793217,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33992687,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.40525267,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40724733,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.47257313,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.47456783,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5398936,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5418883,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.60704786,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6090425,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.67420214,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6761968,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.72772604,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.50166225,"top":1.0,"width":0.016289894,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8330139256751037335
|
-717296106830290723
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
85749
|
NULL
|
NULL
|
NULL
|
|
85750
|
NULL
|
0
|
2026-05-28T13:05:51.502701+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973551502_m1.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.00069444446,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0048611113,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.14131944,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14548612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.28194445,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28611112,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.42256945,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42673612,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.56319445,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5673611,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.7034722,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70763886,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.84375,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.84791666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95555556,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.48333332,"top":0.033333335,"width":0.034027778,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-8330139256751037335
|
-717296106830290723
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
85747
|
NULL
|
NULL
|
NULL
|
|
85749
|
2939
|
16
|
2026-05-28T13:05:48.294804+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973548294_m2.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2706117,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27260637,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.33793217,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33992687,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.40525267,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40724733,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.47257313,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.47456783,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5398936,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5418883,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.60704786,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6090425,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.67420214,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6761968,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.72772604,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.50166225,"top":1.0,"width":0.016289894,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8330139256751037335
|
-717296106830290723
|
idle
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85748
|
2939
|
15
|
2026-05-28T13:05:17.989142+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973517989_m2.jpg...
|
iTerm2
|
docker
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2706117,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27260637,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.33793217,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33992687,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"docker","depth":2,"bounds":{"left":0.40525267,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40724733,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.47257313,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.47456783,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5398936,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5418883,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.60704786,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6090425,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-140-255:~ (-zsh)","depth":2,"bounds":{"left":0.67420214,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6761968,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.72772604,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"docker","depth":1,"bounds":{"left":0.50166225,"top":1.0,"width":0.016289894,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8330139256751037335
|
-717296106830290723
|
typing_pause
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
DOCKER
Close Tab
DEV (docker)
Close Tab
docker
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ec2-user@ip-10-30-129-190:~ (-zsh)
Close Tab
ec2-user@ip-10-30-140-255:~ (-zsh)
Close Tab
⌥⌘1
docker...
|
85746
|
NULL
|
NULL
|
NULL
|
|
85746
|
2939
|
14
|
2026-05-28T13:04:45.706930+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973485706_m2.jpg...
|
iTerm2
|
-zsh
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $
DOCKER
Close Tab
DEV (docker)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $","depth":4,"on_screen":true,"value":"Last login: Wed May 27 12:49:32 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service\nSwitched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker:worker_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-conferences:worker-conferences_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-es-update:worker-es-update_00: stopped\nworker-nudges:worker-nudges_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/Mail/TextRelayService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Services/Mail/TextRelayServiceTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 97, done.\nremote: Counting objects: 100% (97/97), done.\nremote: Compressing objects: 100% (27/27), done.\nremote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)\nUnpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.\nFrom github.com:jiminny/app\n f1ccf9be50..890e429206 master -> origin/master\n ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members\n ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating f1ccf9be50..890e429206\nFast-forward\n app/Services/Mail/TextRelayService.php | 6 +++---\n tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--\n 2 files changed, 14 insertions(+), 5 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay\nSwitched to a new branch 'JY-20915-fix-missing-header-text-relay'\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update\naws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin https://438740370364.dkr.ecr.us-east-2.amazonaws.com\nLogin Succeeded\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\nlatest: Pulling from jiminny/app/qa\nDigest: sha256:92b2c3b1ce5badf9f7add1f42efe3636e3d8ef50ee1b1fd66f7c7dfc539cbf3c\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:latest\ndocker pull 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\narm64v8-latest: Pulling from jiminny/app/qa\nDigest: sha256:d6b7ebd9b71c0480b909d77fceada3df720c6594e4c853228765509b36f52db6\nStatus: Image is up to date for 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\n\nWhat's next:\n View a summary of image vulnerabilities and recommendations → docker scout quickview 438740370364.dkr.ecr.us-east-2.amazonaws.com/jiminny/app/qa:arm64v8-latest\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n 1) app/Services/Mail/TextRelayService.php (statement_indentation)\n ---------- begin diff ----------\n--- /home/jiminny/app/Services/Mail/TextRelayService.php\n+++ /home/jiminny/app/Services/Mail/TextRelayService.php\n@@ -67,7 +67,7 @@\n $job = new EmailTextRelay($messageId, $relayedText);\n $job->onQueue(Constants::QUEUE_EMAILS);\n \n-// dispatch($job);\n+ // dispatch($job);\n \n Log::info('[TextRelayService] Successfully dispatched message', [\n 'message_id' => $messageId,\n\n ----------- end diff -----------\n\n\nFixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 51.755 seconds, 701.18 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-es-update:worker-es-update_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker-emails:worker-emails_00: stopped\nworker-audio:worker-audio_00: stopped\nworker:worker_00: stopped\nworker-conferences:worker-conferences_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.5.5 (cli) (built: Apr 22 2026 01:25:22) (NTS)\nCopyright (c) The PHP Group\nBuilt by https://github.com/docker-library/php\nZend Engine v4.5.5, Copyright (c) Zend Technologies\n with Zend OPcache v8.5.5, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.5.5\nLoaded config default from \".php-cs-fixer.dist.php\".\nRunning analysis on 7 cores with 10 files per process.\n 5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used\n\nDetected deprecations in use (they will stop working in next major release):\n- Rule set \"@PHP74Migration\" is deprecated. Use \"@PHP7x4Migration\" instead.\n- Rule set \"@PHP80Migration\" is deprecated. Use \"@PHP8x0Migration\" instead.\n- Rule set \"@PHP81Migration\" is deprecated. Use \"@PHP8x1Migration\" instead.\n- Rule set \"@PHP82Migration\" is deprecated. Use \"@PHP8x2Migration\" instead.\n- Rule set \"@PHP83Migration\" is deprecated. Use \"@PHP8x3Migration\" instead.\n- Rule set \"@PHP84Migration\" is deprecated. Use \"@PHP8x4Migration\" instead.\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ git status\nOn branch master\nYour branch is up to date with 'origin/master'.\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tpublic/favicon.ico\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 3114, done.\nremote: Counting objects: 100% (2026/2026), done.\nremote: Compressing objects: 100% (676/676), done.\nremote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)\nReceiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.\nResolving deltas: 100% (1255/1255), completed with 182 local objects.\nFrom github.com:jiminny/app\n 828865edeb..96465d0b0b master -> origin/master\n 8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall\n + 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)\n * [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports\n + 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)\n + 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)\n eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing\nUpdating 828865edeb..96465d0b0b\nFast-forward\n app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++\n app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++\n app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\n app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -\n app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++\n app/Models/Activity/Moment.php | 21 +++++++++++++++++++++\n app/Models/Activity/Note.php | 16 ++++++++++++++++\n app/Models/CommentAbstract.php | 4 ++++\n app/Models/Crm/FieldData.php | 6 +++++-\n app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--\n app/Models/Participant.php | 6 ++++++\n app/Traits/RequiresUUID.php | 5 +++++\n scripts/run_command_stage | 2 +-\n tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------\n tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 17 files changed, 472 insertions(+), 22 deletions(-)\n create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php\n create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php\n create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php\n create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php\n create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\nunix:///var/run/supervisor.sock refused connection\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd \ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\nmv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nmake: *** [docker-xdebug-disable] Error 1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2706117,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27260637,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.33793217,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33992687,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.40525267,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40724733,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.47257313,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.47456783,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8244283648578972926
|
-717296381708197667
|
click
|
accessibility
|
NULL
|
Last login: Wed May 27 12:49:32 on ttys012
Poetry Last login: Wed May 27 12:49:32 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ app
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-strict-casting-text-relay-service
Switched to a new branch 'JY-20915-fix-strict-casting-text-relay-service'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5697/5697 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5697 files in 55.554 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-strict-casting-text-relay-service) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M config/logging.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 97 (delta 69), reused 95 (delta 69), pack-reused 0 (from 0)
Unpacking objects: 100% (97/97), 14.08 KiB | 150.00 KiB/s, done.
From github.com:jiminny/app
f1ccf9be50..890e429206 master -> origin/master
ce9abde868..3800efb7ea JY-20905-tool-search-members -> origin/JY-20905-tool-search-members
ad6ace97b9..b3659b1290 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating f1ccf9be50..890e429206
Fast-forward
app/Services/Mail/TextRelayService.php | 6 +++---
tests/Unit/Services/Mail/TextRelayServiceTest.php | 13 +++++++++++--
2 files changed, 14 insertions(+), 5 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co -b JY-20915-fix-missing-header-text-relay
Switched to a new branch 'JY-20915-fix-missing-header-text-relay'
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ make docker-update
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
1) app/Services/Mail/TextRelayService.php (statement_indentation)
---------- begin diff ----------
--- /home/jiminny/app/Services/Mail/TextRelayService.php
+++ /home/jiminny/app/Services/Mail/TextRelayService.php
@@ -67,7 +67,7 @@
$job = new EmailTextRelay($messageId, $relayedText);
$job->onQueue(Constants::QUEUE_EMAILS);
-// dispatch($job);
+ // dispatch($job);
Log::info('[TextRelayService] Successfully dispatched message', [
'message_id' => $messageId,
----------- end diff -----------
Fixed 1 of 5698 files in 84.046 seconds, 701.18 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20915-fix-missing-header-text-relay) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.95.1 Adalbertus by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.5.5
Loaded config default from ".php-cs-fixer.dist.php".
Running analysis on 7 cores with 10 files per process.
5698/5698 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5698 files in 52.731 seconds, 799.06 MB memory used
Detected deprecations in use (they will stop working in next major release):
- Rule set "@PHP74Migration" is deprecated. Use "@PHP7x4Migration" instead.
- Rule set "@PHP80Migration" is deprecated. Use "@PHP8x0Migration" instead.
- Rule set "@PHP81Migration" is deprecated. Use "@PHP8x1Migration" instead.
- Rule set "@PHP82Migration" is deprecated. Use "@PHP8x2Migration" instead.
- Rule set "@PHP83Migration" is deprecated. Use "@PHP8x3Migration" instead.
- Rule set "@PHP84Migration" is deprecated. Use "@PHP8x4Migration" instead.
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ git pull
remote: Enumerating objects: 3114, done.
remote: Counting objects: 100% (2026/2026), done.
remote: Compressing objects: 100% (676/676), done.
remote: Total 1678 (delta 1255), reused 1328 (delta 974), pack-reused 0 (from 0)
Receiving objects: 100% (1678/1678), 260.56 KiB | 1.33 MiB/s, done.
Resolving deltas: 100% (1255/1255), completed with 182 local objects.
From github.com:jiminny/app
828865edeb..96465d0b0b master -> origin/master
8fafc5d81d..04a1cdf13a JY-20606-desktop-app-recall -> origin/JY-20606-desktop-app-recall
+ 724040d8bf...ffebe9ba1e JY-20741-user-can-log-in-access-the-desktop-app -> origin/JY-20741-user-can-log-in-access-the-desktop-app (forced update)
* [new branch] JY-20771-call-scoring-filter-for-exec-reports -> origin/JY-20771-call-scoring-filter-for-exec-reports
+ 145d59435f...346478f081 JY-20828-user-can-manage-desktop-recording-permissions -> origin/JY-20828-user-can-manage-desktop-recording-permissions (forced update)
+ 5428ec3836...a112445df0 JY-20853-mcp-seach_calls -> origin/JY-20853-mcp-seach_calls (forced update)
eb199eee57..6119438d56 JY-20910-schedule-parallel-update-target-processing -> origin/JY-20910-schedule-parallel-update-target-processing
Updating 828865edeb..96465d0b0b
Fast-forward
app/Component/ActionItems/Services/ActionItemsIndexingService.php | 41 +++++++++++++++++++++++++++++++++++++++++
app/Component/ES/Repositories/EsResetActivityRepository.php | 3 +++
app/Component/KeyPoints/Services/KeyPointsIndexingService.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.php | 1 -
app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php | 40 ++++++++++++++++++++++++++++++++++++++++
app/Models/Activity/Moment.php | 21 +++++++++++++++++++++
app/Models/Activity/Note.php | 16 ++++++++++++++++
app/Models/CommentAbstract.php | 4 ++++
app/Models/Crm/FieldData.php | 6 +++++-
app/Models/ElasticSearch/ActivityElasticSearchTrait.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
app/Models/Participant.php | 6 ++++++
app/Traits/RequiresUUID.php | 5 +++++
scripts/run_command_stage | 2 +-
tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.php | 34 +++++++++++++++++-----------------
tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17 files changed, 472 insertions(+), 22 deletions(-)
create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.php
create mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.php
create mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.php
create mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.php
create mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directory
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $
DOCKER
Close Tab
DEV (docker)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85747
|
2938
|
11
|
2026-05-28T13:04:43.339727+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973483339_m1.jpg...
|
iTerm2
|
-zsh
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85100% <78 • Thu 28 May 16:04:43L81ec2-user@ip-10-30-129-...ec2-user@ip-10-30-140-...₴7...
|
NULL
|
5965702463424345214
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85100% <78 • Thu 28 May 16:04:43L81ec2-user@ip-10-30-129-...ec2-user@ip-10-30-140-...₴7...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85745
|
2939
|
13
|
2026-05-28T13:04:43.209438+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973483209_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(...
|
[{"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","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":"Built-in Preview","depth":4,"bounds":{"left":0.35904256,"top":0.15562649,"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":"Chrome","depth":4,"bounds":{"left":0.36768618,"top":0.15562649,"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":"Firefox","depth":4,"bounds":{"left":0.37632978,"top":0.15562649,"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":"Safari","depth":4,"bounds":{"left":0.3849734,"top":0.15562649,"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":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"32","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.010305851,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"81","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.009640957,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"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 Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.41589096,"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.4245346,"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.43550533,"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.44414893,"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.45279256,"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.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":"Tx: Auto","depth":4,"bounds":{"left":0.47473404,"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.5013298,"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.51230055,"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.7237367,"top":0.09896249,"width":0.02825798,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"45","depth":4,"bounds":{"left":0.6938165,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.70611703,"top":0.123703115,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"41","depth":4,"bounds":{"left":0.71542555,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"66","depth":4,"bounds":{"left":0.72706115,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7390292,"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.7463431,"top":0.12210695,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993\nSELECT * FROM users WHERE id = 25061;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 994;\nSELECT * FROM crm_profiles WHERE user_id = 25061;\n\nselect * from crm_configurations where id = 834;\nSELECT * FROM teams WHERE id = 882;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 882 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal\nSELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 933 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;\n\nSELECT * FROM contacts where crm_configuration_id = 834;\nSELECT * FROM opportunities WHERE team_id = 933\n# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');\nAND id IN (8482561,18352941,19042734,19232139,19445140,19472541);\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; #\nSELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 933 and sa.provider = 'hubspot';\n\nselect crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id\nwhere crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')\n# and l.converted_at IS NOT NULL\n;\n\n# ********************************************************************\nSELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')\nand opportunity_id IS NULL\norder by id desc;\n\nSELECT * FROM teams WHERE id = 604; # 598\nSELECT * FROM activities WHERE id = 74410828; # chelseaw@allvoices.co\nSELECT * FROM accounts WHERE id = 20068382;\nSELECT * FROM accounts WHERE id = 35186038;\n\nSELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 559 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;\nselect * from sidekick_settings where team_id = 781;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 711;\nSELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL\nand is_internal = 0 and status = 'completed'\norder by id desc;\n\nSELECT * FROM crm_layout_entities\nWHERE crm_layout_id IN (2352, 2353);\n;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;\nSELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;\nselect * from contacts\nwhere crm_configuration_id = 530\nand crm_provider_id = 872252;\n\nselect * from activities where crm_configuration_id = 530\nand user_id = 14343 and type like '%softphone%'\nand created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);\n\n\nSELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t\nJOIN crm_configurations c ON t.id = c.team_id\nWHERE t.status = 'active';\n\nSELECT * FROM teams where id = 1091;\nSELECT * FROM crm_configurations where team_id = 1091;\nSELECT * FROM activity_providers where team_id = 1091;\nSELECT * FROM activities where crm_configuration_id = 1024 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\n\n\nSELECT * FROM teams WHERE name LIKE '%Leadventure%';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1091 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812\nSELECT * FROM teams where id = 862;\nSELECT * FROM crm_configurations where team_id = 862;\nSELECT * FROM activity_providers where team_id = 862;\nSELECT * FROM activities where crm_configuration_id = 812 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\n\n\nSELECT t.id, crm.id, crm.provider, ap.* FROM teams t\njoin crm_configurations crm on t.id = crm.team_id\njoin activity_providers ap on t.id = ap.team_id\nwhere t.status = 'active' and ap.is_enabled = 1\nand crm.provider = 'hubspot'\nand ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',\n 'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');\n\nSELECT * FROM teams where id = 1068;\nSELECT * FROM crm_configurations where team_id = 1068;\nSELECT * FROM activity_providers where team_id = 1068;\n\nSELECT * FROM activities a\nwhere crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')\nand a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'\n )\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by a.id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1068 and sa.provider = 'hubspot';\n\n# ********************************************************************\n# ********************************************************************\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 933 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262\nSELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 882 and sa.provider = 'hubspot';\nselect * from crm_layouts where crm_configuration_id = 834;\nselect * from crm_layout_entities where crm_layout_id = 2780;\nselect * from crm_fields where id IN (321153,321192,321193,321194);\n\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1057 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8\n\nSELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20\n\nSELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10\n\nSELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #\n\nSELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;\nselect * from users where team_id = 51; # 7783\nSELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130\nselect * from activity_searches where user_id = 7783;\nselect * from activity_search_filters where activity_search_id IN (32291, 32292);\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations where id = 272; # 290 - Bonham & Brook , portalId: 5705856\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th\n# ********************************************************************\nSELECT * FROM crm_configurations where provider = 'hubspot';\nSELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133\nSELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null\n# ********************************************************************\n\nselect * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';\nselect\n cp.*\n# DISTINCT t.id\n# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields\nFROM crm_profiles cp\nJOIN crm_configurations crm on crm.id = cp.crm_configuration_id\nJOIN users u on u.id = cp.user_id\nJOIN teams t ON t.id = crm.team_id\nWHERE crm.provider = 'salesforce' and t.status = 'active'\n and cp.archived_at IS NULL and u.deleted_at IS NULL\n and t.id NOT IN (1093)\n and t.id = 2\n and cp.contact_fields IS NULL;\n# and c.crm_provider_id = '003Uu00000ojD4NIAU';\n\nSELECT * FROM users WHERE id = 26484;\nSELECT * FROM crm_profiles WHERE user_id = 26484;\nSELECT * FROM social_accounts WHERE sociable_id = 26484;\nSELECT * FROM crm_configurations where provider = 'salesforce';\nselect * from users where id IN (10022, 10403);\nselect * from users where team_id IN (526);\nselect * from teams where id IN (526, 532);\nselect * from crm_configurations where id IN (500, 516);\nselect * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);\nselect * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 526 and sa.provider = 'salesforce';\nselect * from team_settings where team_id IN (526, 532);\n\nselect * from users where id IN (22824);\nselect * from crm_profiles where crm_configuration_id IN (1026);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1093 and sa.provider = 'salesforce';\n\nselect * from teams where id = 1099;\nselect * from users where id = 29643\n\nselect * from activity_processing_states;\n\nSELECT * FROM teams where name LIKE '%Fare%'; # 233\nSELECT * FROM opportunities where crm_configuration_id = 215\n# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'\n;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1088 and sa.provider = 'hubspot';\n\nSELECT * FROM teams order by updated_at DESC\nSELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account\n\nselect * from crm_configurations where provider = 'pipedrive';\n\nselect * from teams where id = 957;\nselect * from crm_configurations where id = 957;\n\nSELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743\nSELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;\n\nselect * from users where team_id = 1; # 26726 - Gabriela Dureva\nSELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific\nselect * from activities where user_id = 26726 order by id desc;\nselect * from contacts where crm_configuration_id = 1\nand email IN ('charlotte.ward@prolific.com', 'frankie.bryant@prolific.com'); # 2094416, 2093620\nSELECT * FROM contacts WHERE id = 6284931;\n\nSELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id\nWHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;\n\nselect * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);\nselect * from crm_configurations where id = 1;\n\n43801692-1aeb-32ce-acba-5b80a479701a\n44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b\n405975c0-b3d0-7aaa-821f-09d59cae6dd1\n4caf848d-4bed-2299-b248-7788d41f9fca\n49bedc3f-f196-eef3-89c3-dea6a3b4aa63\n43420989-a09d-b8f8-9806-c8bbf7a02aac\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1 and sa.provider = 'salesforce';\n\nSELECT * FROM activities WHERE id = 75461988;\n\nSELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;\n\nselect * from contacts where id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nselect * from users where id = 21047;\nSELECT * FROM crm_configurations WHERE id = 892;\nSELECT * FROM teams WHERE id = 942;\nselect * from opportunities where team_id = 942 order by updated_at desc;\nselect * from contacts where team_id = 942 order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 942 and sa.provider = 'hubspot';\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430\nSELECT * FROM crm_configurations WHERE id = 1;\nSELECT * FROM teams WHERE crm_id = 1;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1 and sa.provider = 'salesforce';\n\nselect id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1\nSELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430\n\nselect * from teams where id = 852;\nselect * from groups where id = 2286;\nselect * from sidekick_settings where team_id = 852;\nselect * from default_activity_types where team_id = 852;\n\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1 AND u.deleted_at IS NULL\nAND u.crm_required = 1\nAND u.team_id = 1\nORDER BY u.team_id;\n\nSELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (\n18481\n );\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1\n AND u.deleted_at IS NULL\n AND u.crm_required = 1\n# AND u.team_id = 1\n AND p.id IS NULL -- Move this condition to WHERE clause\nORDER BY u.team_id;\n\nSELECT * FROM opportunities WHERE id = 20002609;\nselect * from teams where id = 1122; # Velatir, 29953 - christian@velatir.com\nselect * from crm_configurations where id = 1060;\nselect * from crm_layouts where crm_configuration_id = 1060;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1122 and sa.provider = 'hubspot';\nselect * from opportunities where team_id = 1122 order by updated_at desc;\n\nselect * from crm_field_data where object_type = 'contact';\n\nSELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 248 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS\nSELECT * FROM users where id = 24115;\nSELECT * FROM accounts where id = 4002896;\nSELECT * FROM teams WHERE name LIKE '%adswerve%';\nSELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN (\"0069N000003GIQ9QAO\",\"0061r000019yGP9AAM\",\"0066900001S2KWlAAN\",\"0066900001TDpj2AAD\",\"0066900001b8uEwAAI\",\"0069N000001rQi0QAE\",\"006QF00000KD40mYAD\",\"006QF00000LzpRJYAZ\",\"0069N000002uomtQAA\",\"0069N000002xlMLQAY\",\"0066900001NV6ubAAD\",\"0061r00001HJp45AAD\",\"006QF00000uTlUoYAK\",\"006QF00000v0bZqYAI\");\nSELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203\n\nSELECT u.id, u.email, ac.name, a.* FROM activities a\nJOIN users u ON a.user_id = u.id\nJOIN accounts ac ON a.account_id = ac.id\nWHERE\nuuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or\nuuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or\nuuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;\n\nselect * from users where id = 5825;\nSELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;\n\nselect * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;\n19594, 862\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 862 and sa.provider = 'salesforce';\n\nselect * from automated_reports where id = 36;\nselect ar.frequency, r.*, ar.* from automated_report_results r\njoin automated_reports ar on r.report_id = ar.id\nwhere ar.frequency != 'one_off';\n\nselect s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;\nselect * from nudges n where n.activity_search_id\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;\n\nselect * from users where team_id = 1 and name like '%Lukas%'; # 7160\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\nSELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,\nselect * from opportunities where team_id = 1126;\nSELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,\nselect * from opportunities where team_id = 1125;\nselect * from contacts c\nwhere c.team_id = 882;\n\nSELECT * FROM activities WHERE id = 76822967;\nSELECT * FROM crm_profiles WHERE user_id = 15440;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 555;\nSELECT * FROM crm_configurations WHERE id = 555;\nSELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 581 and sa.provider = 'salesforce';\n\nSELECT * FROM automated_report_results order by id desc;\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556;\n\nselect * from automated_reports;\nwhere id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , [\"pdf\",\"podcast\"]\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\nselect * from automated_report_results order by id desc;\nSELECT * FROM automated_report_results WHERE id = 1919;\n\nselect * from automated_report_results WHERE report_id = 54;\n\nselect * from opportunities where id = 7594349;\n\nSELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyintegration@lesmills.com\nselect * from playbooks where team_id = 711; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 5515;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 692;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 711 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;\n\nselect * from leads;\n\nselect * from calendars;\n\nSELECT\n t.id AS team_id,\n t.name,\n LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain\nFROM teams t\nJOIN users u ON u.team_id = t.id\nJOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'\nLEFT JOIN team_domains td\n ON td.team_id = t.id\n AND td.deleted_at IS NULL\n AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))\nGROUP BY t.id, t.name, calendar_domain\nORDER BY t.name, calendar_domain;\n\nselect * from users u join calendars c on c.user_id = u.id\nwhere u.team_id = 882;\n\n\nselect * from activities where id = 74049485; # team 563 crm 537\nselect * from activities where id = 73272382; # team 563 crm 537\nselect * from activities where id = 64400389; # team 563 crm 537\nselect * from activities where id = 58081273; # team 563 crm 537\nselect * from activities where id = 54520297; # team 563 crm 537\nselect * from participants where activity_id = 58081273;\n\nselect * from activities where crm_configuration_id = 537 and provider = 'aircall'\nand account_id = 19003658 order by updated_at desc;\n\nselect * from contacts where crm_configuration_id = 537 and id = 35957759;\nselect * from accounts where crm_configuration_id = 537 and id = 19003658;\n\nselect * from automated_report_results where id = 1976;\nselect * from automated_reports where id = 583;\nselect * from activity_searches where id = 87714;\nselect * from activity_search_filters where activity_search_id = 87714;\n\nSELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid\nor uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot';\nselect * from rate_limits;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2\nand id IN (18, 1872);\nselect * from automated_reports where id = 54;\nSELECT * FROM users WHERE id IN (24623,29443,29613);\n\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\n\nselect * from text_relays where created_at > '2026-05-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 = .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\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 = 1117 and sa.provider = 'hubspot';\nSELECT * FROM activities WHERE uuid_to_bin('8024fffb-2df7-4017-91f4-d9f896050248') = uuid; # 79933459 YES\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192 NO\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;\nselect * from playbooks where id = 5473;\nselect * from playbook_categories where id = 43783;\nselect * from playbook_categories where playbook_id = 5473;\nselect * from crm_fields where id = 659242;\nselect * from crm_field_values where crm_field_id = 659242;\n\nSELECT * FROM crm_field_data fd\n# JOIN crm_fields f ON fd.crm_field_id = f.id\n# JOIN activities a ON fd.activity_id = a.id\nWHERE activity_id = 79933459\n# AND f.crm_provider_id = 'hs_activity_type';\n\n\nSELECT * FROM activity_messages;\nselect * from text_relays where created_at > '2026-05-01';\nselect * from activities where user_id IN (7160, 18608) and created_at > '2026-05-22' order by id desc;\nselect * from users where team_id = 1 and id IN (18608, 13934, 7160);\nselect * from activities where user_id = 7160 order by id desc limit 10;\n\nselect * from accounts where team_id = 1 and name = 'Column5';\n\nselect * from users where name like '%Subra%'; # 31054, 1117\nselect * from teams where id = 1117;\nselect * from activity_searches where user_id = 31054;\nselect * from activity_search_filters where activity_search_id IN (88882, 88902);","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-05-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 = .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\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 = 1117 and sa.provider = 'hubspot';\nSELECT * FROM activities WHERE uuid_to_bin('8024fffb-2df7-4017-91f4-d9f896050248') = uuid; # 79933459 YES\nSELECT * FROM activities WHERE uuid_to_bin('25529043-8094-4781-927f-4f4da2a8185c') = uuid; # 80186192 NO\nSELECT * FROM crm_configurations WHERE id = 1053;\nSELECT * FROM teams WHERE id = 1117;\nselect * from users where id = 30249;\nselect * from playbooks where id = 5473;\nselect * from playbook_categories where id = 43783;\nselect * from playbook_categories where playbook_id = 5473;\nselect * from crm_fields where id = 659242;\nselect * from crm_field_values where crm_field_id = 659242;\n\nSELECT * FROM crm_field_data fd\n# JOIN crm_fields f ON fd.crm_field_id = f.id\n# JOIN activities a ON fd.activity_id = a.id\nWHERE activity_id = 79933459\n# AND f.crm_provider_id = 'hs_activity_type';\n\n\nSELECT * FROM activity_messages;\nselect * from text_relays where created_at > '2026-05-01';\nselect * from activities where user_id IN (7160, 18608) and created_at > '2026-05-22' order by id desc;\nselect * from users where team_id = 1 and id IN (18608, 13934, 7160);\nselect * from activities where user_id = 7160 order by id desc limit 10;\n\nselect * from accounts where team_id = 1 and name = 'Column5';\n\nselect * from users where name like '%Subra%'; # 31054, 1117\nselect * from teams where id = 1117;\nselect * from activity_searches where user_id = 31054;\nselect * from activity_search_filters where activity_search_id IN (88882, 88902);","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}]...
|
4911831517688950861
|
-6520523836328617179
|
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
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(...
|
85744
|
NULL
|
NULL
|
NULL
|
|
85744
|
2939
|
12
|
2026-05-28T13:04:39.615208+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973479615_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomViewNeweNNCCoocKelucioWindowFV faVsco.|s ~# rapstomViewNeweNNCCoocKelucioWindowFV faVsco.|s ~#12121 on JY-20963-fx-eSarvicc.ohwnapers.oh©ActivityControlier.php• HttpIntegrationslinteractionsJobshwioDonciwcr.onyTeom.onec) e enupn;E custom.logA console (STAGING)A SF fiminny@localhost)HSJocal (jiminny@blocalhost)console (PROD) X2019class ServiceTest extends TestCasepublic function testParseContactMobileWithValidNumberO: voida Maili ModeleNotificationsvoseiversSocialAccountOoserverlest2674Sresult = self::invokePrivateMethod( methodName: 'parseContactMobile', Sservice. [null. Screbatal)e78)thts-sassertNorultSresulthiso assent sanet exocctesUserRoleObserverTest.pho7es=78%-78lPolcies2699public function testParsecontactHob1lelstruncatedtoz5chars: vo1c26322633SseruiceThisosoerSenys celockioMlonaluchen 42:05558s>EACtVIYla ActivityProvider:Sermlata = T"MobslePhone" = Sonolluchen718711=712713=724i CalendarTeonterencoa erm→Rulihorclose Sresult = self::invokePrivateMethod( methodName: "parseContactMobile', Sservice, [nutz, ScreDatal): 715Wthss-SaccentMotMullScesultpublic function testParseContactMobfleWithCountryCode@: voidTin Helners2644eveesuoocservcnockoScrmbata = 'MobilePhone' => *07911123456'1#Ti HibsootD IntegrationApplllistenars264626472649PipedriveImSolestoroe› D Fields2650D OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.o( DeleteObiocts TraitTest 2724anhnafniioastestoh© GetActivitvFieldNameT 2726 0>[EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohSresult = selt::nvokePrzverehez hodl methoowamethis-sassertNotNulSresulosthis-yassertStringStartsiottheorehc"44 Sresultpublic functsion testinoort0pportunitvSkiosllhenProfileNotFoundO= voidi....Cass Has"envsytanded aytends Hastanybubtic function whereot...public function firstot...HHHI IBETIIIMEPRRBERRRC Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest oho(CacharCrmSanicehom+ 1of2editsAccept Fle x= X. Reject File oxQTy: AutowINTERVAL 38 DAY.by 0.z0, u.caszlu.name u.sotcphone nunbenBY sns_count DESC;* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (oaner)' ELSE ** END) AS user_id,ouner_1d FROh soclal,accounts saSeNG MOeans t.nc->1Sontd M.teandU.tean_id = 1117 and sa.provider = "hubspot":*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES* FROM activities WHERE uuid_to_bin('[CREDIT_CARD]-927f-4f4da2a8185c') = uuid: # 80186192 NO*EROM eon confaurazons MHEPF 3d = 1953%* FROM teans WHERE 1d = 1117:* fron users where id = 30249:* fron playbooks where id = 5473;* fron playbook categonies where id = 43783:* fron playbook categories where playbook_id = 5473:* fron crn_fields where id = 659242:* fron cra_field values where cra_field_id = 659242:* FROM Crn_field_dato fdcrnfields f ON fd.crm field id = f.ioacrviies a UN to.acovity 1d = a.10activity_id = 79933459f.crn_provider_id = 'hs activity_type'* FROM activity_messages;where created at > *2826-05-91*•* fron activities where user_id IN (7160, 18608) and created_at > ^2026-05-22' order by id desc;* fron users where team id = 1 and id TN (18688, 13934. 7169)=* fron activities where user_id = 7160 order by id desc linit 10;Toon tasne whanda4* fron activity_searches where user_id = 31854*Eoon sctkusty coanch filitane nhans sctfusty conoch SA TM CARRR2 RRO02# console fiaum045 A1 A41 У 66 4TO0У L7Thu 28 May 16:04:39ServiceTesteeendhles orchwerwicee+0.testsruexec dovkers/crm/3 bestore 5e/vicer/stmphpy - iterwenest/brseContact' 2561PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelourarcion.Tno.e/uminnyl chounx=11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MEAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha ull SarufcaTast to contimm nothioa ie brokaa.• decter exe sdrcker /era/3 bestore Servioeeeitetnay 55 php a5vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Confiquration:/home/siminny/phpunit.xmD.•DODOD..•••D000.DD.......••• 65 / 73 ( 894TIeA: 60:21 704 MamArus oA ao MoA.7s tests pass. Herc's a summary of what was added:oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths — added 7newssanrsctontact phos•testParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?"esParsccontad Phonewnextens ton -moerwihler ucotttoyerracthe orensottastpareacontsctPhanafytictruncatetto10charc=sytwttlanowthom.th/chhre.ootethindstodltGtruehtaetbareacontnetPhondthrountrtodestocallkoimottheo.watowmeine.cotntmcooparseContactMobiletestparsctonthe wontethaldwuher- Eo numoeteturnd noetActPAreAGontcMahsnTetrunestMhT/20Ghhre-Mimawtlwaw than.2fchare note thinastorlGtrehedtACtOsrcAGAnt.CMAKSlWWAthGAuAtCUCAA.FTAAITIKmANATMeALItAr/mcima.AMintrv.chGunl-1tile +80 2Ask anything (XOL)AdhotvAccept allKwodeurlhimewwkres*4 space...
|
NULL
|
3110981459662262920
|
NULL
|
visual_change
|
ocr
|
NULL
|
rapstomViewNeweNNCCoocKelucioWindowFV faVsco.|s ~# rapstomViewNeweNNCCoocKelucioWindowFV faVsco.|s ~#12121 on JY-20963-fx-eSarvicc.ohwnapers.oh©ActivityControlier.php• HttpIntegrationslinteractionsJobshwioDonciwcr.onyTeom.onec) e enupn;E custom.logA console (STAGING)A SF fiminny@localhost)HSJocal (jiminny@blocalhost)console (PROD) X2019class ServiceTest extends TestCasepublic function testParseContactMobileWithValidNumberO: voida Maili ModeleNotificationsvoseiversSocialAccountOoserverlest2674Sresult = self::invokePrivateMethod( methodName: 'parseContactMobile', Sservice. [null. Screbatal)e78)thts-sassertNorultSresulthiso assent sanet exocctesUserRoleObserverTest.pho7es=78%-78lPolcies2699public function testParsecontactHob1lelstruncatedtoz5chars: vo1c26322633SseruiceThisosoerSenys celockioMlonaluchen 42:05558s>EACtVIYla ActivityProvider:Sermlata = T"MobslePhone" = Sonolluchen718711=712713=724i CalendarTeonterencoa erm→Rulihorclose Sresult = self::invokePrivateMethod( methodName: "parseContactMobile', Sservice, [nutz, ScreDatal): 715Wthss-SaccentMotMullScesultpublic function testParseContactMobfleWithCountryCode@: voidTin Helners2644eveesuoocservcnockoScrmbata = 'MobilePhone' => *07911123456'1#Ti HibsootD IntegrationApplllistenars264626472649PipedriveImSolestoroe› D Fields2650D OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.o( DeleteObiocts TraitTest 2724anhnafniioastestoh© GetActivitvFieldNameT 2726 0>[EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohSresult = selt::nvokePrzverehez hodl methoowamethis-sassertNotNulSresulosthis-yassertStringStartsiottheorehc"44 Sresultpublic functsion testinoort0pportunitvSkiosllhenProfileNotFoundO= voidi....Cass Has"envsytanded aytends Hastanybubtic function whereot...public function firstot...HHHI IBETIIIMEPRRBERRRC Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest oho(CacharCrmSanicehom+ 1of2editsAccept Fle x= X. Reject File oxQTy: AutowINTERVAL 38 DAY.by 0.z0, u.caszlu.name u.sotcphone nunbenBY sns_count DESC;* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (oaner)' ELSE ** END) AS user_id,ouner_1d FROh soclal,accounts saSeNG MOeans t.nc->1Sontd M.teandU.tean_id = 1117 and sa.provider = "hubspot":*EROM actMtes WHEOF Wund to binl18a2tetth-2147-1817.0144-40480695926801= Musd: " 70033459 VES* FROM activities WHERE uuid_to_bin('[CREDIT_CARD]-927f-4f4da2a8185c') = uuid: # 80186192 NO*EROM eon confaurazons MHEPF 3d = 1953%* FROM teans WHERE 1d = 1117:* fron users where id = 30249:* fron playbooks where id = 5473;* fron playbook categonies where id = 43783:* fron playbook categories where playbook_id = 5473:* fron crn_fields where id = 659242:* fron cra_field values where cra_field_id = 659242:* FROM Crn_field_dato fdcrnfields f ON fd.crm field id = f.ioacrviies a UN to.acovity 1d = a.10activity_id = 79933459f.crn_provider_id = 'hs activity_type'* FROM activity_messages;where created at > *2826-05-91*•* fron activities where user_id IN (7160, 18608) and created_at > ^2026-05-22' order by id desc;* fron users where team id = 1 and id TN (18688, 13934. 7169)=* fron activities where user_id = 7160 order by id desc linit 10;Toon tasne whanda4* fron activity_searches where user_id = 31854*Eoon sctkusty coanch filitane nhans sctfusty conoch SA TM CARRR2 RRO02# console fiaum045 A1 A41 У 66 4TO0У L7Thu 28 May 16:04:39ServiceTesteeendhles orchwerwicee+0.testsruexec dovkers/crm/3 bestore 5e/vicer/stmphpy - iterwenest/brseContact' 2561PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelourarcion.Tno.e/uminnyl chounx=11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MEAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha ull SarufcaTast to contimm nothioa ie brokaa.• decter exe sdrcker /era/3 bestore Servioeeeitetnay 55 php a5vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Confiquration:/home/siminny/phpunit.xmD.•DODOD..•••D000.DD.......••• 65 / 73 ( 894TIeA: 60:21 704 MamArus oA ao MoA.7s tests pass. Herc's a summary of what was added:oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths — added 7newssanrsctontact phos•testParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?"esParsccontad Phonewnextens ton -moerwihler ucotttoyerracthe orensottastpareacontsctPhanafytictruncatetto10charc=sytwttlanowthom.th/chhre.ootethindstodltGtruehtaetbareacontnetPhondthrountrtodestocallkoimottheo.watowmeine.cotntmcooparseContactMobiletestparsctonthe wontethaldwuher- Eo numoeteturnd noetActPAreAGontcMahsnTetrunestMhT/20Ghhre-Mimawtlwaw than.2fchare note thinastorlGtrehedtACtOsrcAGAnt.CMAKSlWWAthGAuAtCUCAA.FTAAITIKmANATMeALItAr/mcima.AMintrv.chGunl-1tile +80 2Ask anything (XOL)AdhotvAccept allKwodeurlhimewwkres*4 space...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85743
|
2938
|
10
|
2026-05-28T13:04:38.707379+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973478707_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER881DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:04:381₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
1264619683831542745
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER881DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:04:381₴1ec2-user@ip-10-30-140-...₴7...
|
85741
|
NULL
|
NULL
|
NULL
|
|
85742
|
2939
|
11
|
2026-05-28T13:04:34.664998+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973474664_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomEV faVsco,ls ~ViewCooc#12121 on JY-20963-fo rapstomEV faVsco,ls ~ViewCooc#12121 on JY-20963-fox-hС НttpIntegrations@ interactionsJobsO MailC Modelsanoureatonsvoseivers© SocialAccountObserverTest,;C UserObserverTest.phpE UserRoleObserverTest.phpPolcies>EACtVIYActivityProviders@ CalendarTeonterenco•RullmeenClose& Copper@ HubspotListenersPipedriveSalesforce• FieidsOpportunityMatcherOpportunitySyncStrateProspectSearchStrateg& Service Traits© ClientTest.php© DecorateActivity Test.p© DeleteObjects TraitTest© FieidDefinitions Test.ph© GetActivityFieidNameT© PayloadBullder Test.phyE QueryBullder Test.php© QueryHandler Test.php©QuerviteratorTest.ohr© QueryResultsTests.phpC Semceltestoo© SyncBatchRedisService@ RaseSeniiceTest oho(el CacherCrm Senvicaßeco?Windowwnapers.ohyTeom.one©ActivityController.phpA SF (iminny@localhost)ConsoNe (STAGING)DP000• TXAUtOvBY u.id, u.email, u.name, u.softphone_number* fron teans where id = 1;A console (EU?045 A1 441 X66 ^manesoaceeses ui NerwcestearesoneCurssirvcaloslexcondsesstpublic function testFetchAndAssociateRelatedActivity(): voidSclient = Sthis->createMock( originsSpayLoadBuilder = Sthis->createMock( originalClassNgSpayLoadBuilder->nethod( constralClient::class):= PayloadBuilden::class);ScountriesMap = Sthis-›createMock( criginalClassNe/** Bvar ServicesMockObject SserviceMock */SserviceMock = Sthis->getMockßuilder( className: Service::class)->setConstructorArgs([Sclient.SoayLoadbuzloersevencurspaccherScountriesMap,Sthis->createMock( origina/ClassN>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo->mnadl ciTerchie fred.cewiy'-sweeerumnia'Description' => 'Test description'.Steam = Sthis-›createMock( originTean: :class);"aetattobute"oythltnroumdt"tean"oyil Return SteamPlaybook::class);Splaybook->method (totaf2ndigetAd V Accept Fle X--X PeRet6Mn C-%800nulU);= 709710711=722733fron text_relays where created_at > '2026-85-01*:fron activities where user id IN (7160, 18608) and created_at > ^2026-05-22' order by id desc:* fron users where team_id = 1 and id IN (18608, 13934, 7160);* fron activities where user_id = 7160 order by id desc linit 10;* fron teans where id = 1117:fron activity_search_filters nhere activity_search_id IN (88882, 88902)TO0У L7Inu cowoy 1o:04.54U ServiceTest ~Cascadeles orchwerwicee+0.decker nxe dovkces/cr/5 best ree/Servicee/31.php hervendsr/orsepontact: 2261PHPUnit 11.5.55 by Sebastian Bergnann and contributors.PHP 8.S.Sconteouratciont no.e/tminayohounsx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet me also quickly run the full ServiceTest to confirm nothing is broken:o desterext deckee/er/ lestore Serviceestphg s h ventaen -2/b3n/phpunitPHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Configuration: /hose/jiminny/phpunit.xmlD.•DODOD..•••D000.DD.......••• 65 / 73 ( 894Time: 00:21.744, Memory: 94.00 MBA.7s tests pass. Herc's a summary of what was added:oo eoesnewssThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7parseContactPhone• testParseContactPhonewithValidVumber - E.164 number parses correctly, ext is nutl"esParsccontad Phontwnexens ton -Tmoer winleroconttoty erracthe exensotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobitetestParsctontae Nonathaiddwuher - Eo numoee teturnd noek•testParseContactMobileIsTruncatedTo25Chars - Number longer than 25 chars gets truncated (Str:: 1iml•testParseContactMob{leW{thCountryCode - Local UK mobile resolved to +44. using country codeB ul -1tile +80 2Accept allAsk anything (XOL)" PodnAdhotvutwoderesmes2 4 space:...
|
NULL
|
4973697426431662652
|
NULL
|
click
|
ocr
|
NULL
|
rapstomEV faVsco,ls ~ViewCooc#12121 on JY-20963-fo rapstomEV faVsco,ls ~ViewCooc#12121 on JY-20963-fox-hС НttpIntegrations@ interactionsJobsO MailC Modelsanoureatonsvoseivers© SocialAccountObserverTest,;C UserObserverTest.phpE UserRoleObserverTest.phpPolcies>EACtVIYActivityProviders@ CalendarTeonterenco•RullmeenClose& Copper@ HubspotListenersPipedriveSalesforce• FieidsOpportunityMatcherOpportunitySyncStrateProspectSearchStrateg& Service Traits© ClientTest.php© DecorateActivity Test.p© DeleteObjects TraitTest© FieidDefinitions Test.ph© GetActivityFieidNameT© PayloadBullder Test.phyE QueryBullder Test.php© QueryHandler Test.php©QuerviteratorTest.ohr© QueryResultsTests.phpC Semceltestoo© SyncBatchRedisService@ RaseSeniiceTest oho(el CacherCrm Senvicaßeco?Windowwnapers.ohyTeom.one©ActivityController.phpA SF (iminny@localhost)ConsoNe (STAGING)DP000• TXAUtOvBY u.id, u.email, u.name, u.softphone_number* fron teans where id = 1;A console (EU?045 A1 441 X66 ^manesoaceeses ui NerwcestearesoneCurssirvcaloslexcondsesstpublic function testFetchAndAssociateRelatedActivity(): voidSclient = Sthis->createMock( originsSpayLoadBuilder = Sthis->createMock( originalClassNgSpayLoadBuilder->nethod( constralClient::class):= PayloadBuilden::class);ScountriesMap = Sthis-›createMock( criginalClassNe/** Bvar ServicesMockObject SserviceMock */SserviceMock = Sthis->getMockßuilder( className: Service::class)->setConstructorArgs([Sclient.SoayLoadbuzloersevencurspaccherScountriesMap,Sthis->createMock( origina/ClassN>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo->mnadl ciTerchie fred.cewiy'-sweeerumnia'Description' => 'Test description'.Steam = Sthis-›createMock( originTean: :class);"aetattobute"oythltnroumdt"tean"oyil Return SteamPlaybook::class);Splaybook->method (totaf2ndigetAd V Accept Fle X--X PeRet6Mn C-%800nulU);= 709710711=722733fron text_relays where created_at > '2026-85-01*:fron activities where user id IN (7160, 18608) and created_at > ^2026-05-22' order by id desc:* fron users where team_id = 1 and id IN (18608, 13934, 7160);* fron activities where user_id = 7160 order by id desc linit 10;* fron teans where id = 1117:fron activity_search_filters nhere activity_search_id IN (88882, 88902)TO0У L7Inu cowoy 1o:04.54U ServiceTest ~Cascadeles orchwerwicee+0.decker nxe dovkces/cr/5 best ree/Servicee/31.php hervendsr/orsepontact: 2261PHPUnit 11.5.55 by Sebastian Bergnann and contributors.PHP 8.S.Sconteouratciont no.e/tminayohounsx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet me also quickly run the full ServiceTest to confirm nothing is broken:o desterext deckee/er/ lestore Serviceestphg s h ventaen -2/b3n/phpunitPHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Configuration: /hose/jiminny/phpunit.xmlD.•DODOD..•••D000.DD.......••• 65 / 73 ( 894Time: 00:21.744, Memory: 94.00 MBA.7s tests pass. Herc's a summary of what was added:oo eoesnewssThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7parseContactPhone• testParseContactPhonewithValidVumber - E.164 number parses correctly, ext is nutl"esParsccontad Phontwnexens ton -Tmoer winleroconttoty erracthe exensotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobitetestParsctontae Nonathaiddwuher - Eo numoee teturnd noek•testParseContactMobileIsTruncatedTo25Chars - Number longer than 25 chars gets truncated (Str:: 1iml•testParseContactMob{leW{thCountryCode - Local UK mobile resolved to +44. using country codeB ul -1tile +80 2Accept allAsk anything (XOL)" PodnAdhotvutwoderesmes2 4 space:...
|
85740
|
NULL
|
NULL
|
NULL
|
|
85741
|
2938
|
9
|
2026-05-28T13:04:34.562166+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973474562_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:04:341₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
-7589044116343815266
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:04:341₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85740
|
2939
|
10
|
2026-05-28T13:04:25.522503+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973465522_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomEV favscojs ~ViewCooc#12121 on JY-20963-fox rapstomEV favscojs ~ViewCooc#12121 on JY-20963-fox-hС НttpIntegrations@ interactionsJobsO MailC Modelsanoureatonsvoseivers© SocialAccountObserverTest,;C UserObserverTest.phpE UserRoleObserverTest.phpPolcies>EACtVIYActivityProviders@ CalendarTeonterenco•RullmeenClose& Copper@ HubspotListenersPipedriveSalesforce• FieidsOpportunityMatcherOpportunitySyncStrateProspectSearchStrateg& Service Traits© ClientTest.php© DecorateActivity Test.p© DeleteObjects TraitTest© FieidDefinitions Test.ph© GetActivityFieidNameT© PayloadBullder Test.phyE QueryBullder Test.php© QueryHandler Test.php©QuerviteratorTest.ohr© QueryResultsTests.phpC Semceltestoo© SyncBatchRedisService@ RaseSeniiceTest oho(el CacherCrm Senvicaßeco?3g% 9Windowwnapers.ohyTeom.one©ActivityController.phpA SF (iminny@localhost)ConsoNe (STAGING)DP000• TXAUtOvBY u.id, u.enail, u.name, u.softphone_number* fron teans where id = 1;A console (EU?045 A1 441 X66 ^Curssirvcaloslexcondsesstpublic function testFetchAndAssociateRelatedActivity(): voidSclient = Sthis->createMock( originsSpayLoadBuilder = Sthis->createMock( originalClassNgSpayLoadBuilder->nethod( constraClient::class):= PayloadBuilder::class):ScountriesMap = Sthis->createMock( origh/** Bvar ServicesMockObject SserviceMock */SserviceMock = Sthis->getMockßuilder( className: Service::class)->setConstructorArgs([Sclient.SoayLoadbuzloersevencurspaccherScountriesMap,Sthis->createMock( origina/ClassN>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo->mnadl ci"fetchRelatedActävity")-sweeerumnia'Description' => 'Test description'.Steam = Sthis->createMock( orig)Tean: :class);"aetattobute" oythitnroums"tean"oyil Return SteamPlaybook::class);Splaybook->method(toi.af 2mdMOcLAd ~ ACCept Fle X- bX PeRet 5Mn ( 359u0DE nULU:SpLaybook-›method( constraint: 'getActivityType') -›willReturn( value: PLaybook::ACTIVITY_TYPE_EVENT):= 709710711=722733fron text_relays where created_at > *2026-85-01*)fron activities where user_id IN (7160, 18608) and created_at › '2026-05-22' order by id desc;* fron users where team_id = 1 and id IN (18608, 13934, 7160);* fron activities where user_id = 7160 order by id desc Linit 10;fron teans where id = 1117;fron activity_search_filters nhere activity_search_id IN (88882, 88902)TO0У L7Thu 28 May 16:04:25U ServiceTest ~Cascadelesorceserwiceedecker nxe dovkces/cr/5 best ree/Servicee/31.php hervendsr/orsepontact: 2261PHPUnit 11.5.55 by Sebastian Bergnann and contributors.PHP 8.S.Scontelouratciontnore/tinnyl ohounx"+0.11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet me also quickly run the full ServiceTest to confirm nothing is broken:o desterext deckee/er/ lestore Serviceestphg s h ventaen -2/b3n/phpunitPHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Configuration: /hose/jiminny/phpunit.xmlD.•DODOD..•••D000.DD.......••• 65 / 73 ( 894Time: 00:21.744, Memory: 94.00 MBA.7s tests pass. Herc's a summary of what was added.oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7newssparseContactPhone• testParseContactPhonewithValidNVumber - E.164 number parses correctly, ext is nutt"esParsccontad Phontwnexens ton -Tmoer winleroconttoty erracthe exensotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobitetestParsctontae Nonathaiddwuher - Eo numoee teturnd noek•testParseContactMobileIsTruncatedTo25Chars - Number longer than 25 chars gets truncated (Str:: 1iml•testParseContactMob1leW{thCountryCode - Local UK mobile resolved to +44. using country codeBul -1tile +80 2Accept allAsk anything (XOL)Adhotvutwdeurlatmekelwhireh2 4 space:...
|
NULL
|
-5987254938711499162
|
NULL
|
click
|
ocr
|
NULL
|
rapstomEV favscojs ~ViewCooc#12121 on JY-20963-fox rapstomEV favscojs ~ViewCooc#12121 on JY-20963-fox-hС НttpIntegrations@ interactionsJobsO MailC Modelsanoureatonsvoseivers© SocialAccountObserverTest,;C UserObserverTest.phpE UserRoleObserverTest.phpPolcies>EACtVIYActivityProviders@ CalendarTeonterenco•RullmeenClose& Copper@ HubspotListenersPipedriveSalesforce• FieidsOpportunityMatcherOpportunitySyncStrateProspectSearchStrateg& Service Traits© ClientTest.php© DecorateActivity Test.p© DeleteObjects TraitTest© FieidDefinitions Test.ph© GetActivityFieidNameT© PayloadBullder Test.phyE QueryBullder Test.php© QueryHandler Test.php©QuerviteratorTest.ohr© QueryResultsTests.phpC Semceltestoo© SyncBatchRedisService@ RaseSeniiceTest oho(el CacherCrm Senvicaßeco?3g% 9Windowwnapers.ohyTeom.one©ActivityController.phpA SF (iminny@localhost)ConsoNe (STAGING)DP000• TXAUtOvBY u.id, u.enail, u.name, u.softphone_number* fron teans where id = 1;A console (EU?045 A1 441 X66 ^Curssirvcaloslexcondsesstpublic function testFetchAndAssociateRelatedActivity(): voidSclient = Sthis->createMock( originsSpayLoadBuilder = Sthis->createMock( originalClassNgSpayLoadBuilder->nethod( constraClient::class):= PayloadBuilder::class):ScountriesMap = Sthis->createMock( origh/** Bvar ServicesMockObject SserviceMock */SserviceMock = Sthis->getMockßuilder( className: Service::class)->setConstructorArgs([Sclient.SoayLoadbuzloersevencurspaccherScountriesMap,Sthis->createMock( origina/ClassN>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo->mnadl ci"fetchRelatedActävity")-sweeerumnia'Description' => 'Test description'.Steam = Sthis->createMock( orig)Tean: :class);"aetattobute" oythitnroums"tean"oyil Return SteamPlaybook::class);Splaybook->method(toi.af 2mdMOcLAd ~ ACCept Fle X- bX PeRet 5Mn ( 359u0DE nULU:SpLaybook-›method( constraint: 'getActivityType') -›willReturn( value: PLaybook::ACTIVITY_TYPE_EVENT):= 709710711=722733fron text_relays where created_at > *2026-85-01*)fron activities where user_id IN (7160, 18608) and created_at › '2026-05-22' order by id desc;* fron users where team_id = 1 and id IN (18608, 13934, 7160);* fron activities where user_id = 7160 order by id desc Linit 10;fron teans where id = 1117;fron activity_search_filters nhere activity_search_id IN (88882, 88902)TO0У L7Thu 28 May 16:04:25U ServiceTest ~Cascadelesorceserwiceedecker nxe dovkces/cr/5 best ree/Servicee/31.php hervendsr/orsepontact: 2261PHPUnit 11.5.55 by Sebastian Bergnann and contributors.PHP 8.S.Scontelouratciontnore/tinnyl ohounx"+0.11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet me also quickly run the full ServiceTest to confirm nothing is broken:o desterext deckee/er/ lestore Serviceestphg s h ventaen -2/b3n/phpunitPHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Configuration: /hose/jiminny/phpunit.xmlD.•DODOD..•••D000.DD.......••• 65 / 73 ( 894Time: 00:21.744, Memory: 94.00 MBA.7s tests pass. Herc's a summary of what was added.oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7newssparseContactPhone• testParseContactPhonewithValidNVumber - E.164 number parses correctly, ext is nutt"esParsccontad Phontwnexens ton -Tmoer winleroconttoty erracthe exensotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobitetestParsctontae Nonathaiddwuher - Eo numoee teturnd noek•testParseContactMobileIsTruncatedTo25Chars - Number longer than 25 chars gets truncated (Str:: 1iml•testParseContactMob1leW{thCountryCode - Local UK mobile resolved to +44. using country codeBul -1tile +80 2Accept allAsk anything (XOL)Adhotvutwdeurlatmekelwhireh2 4 space:...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85739
|
2938
|
8
|
2026-05-28T13:04:25.417050+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973465417_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"app/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.phpX4348-zsh+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976+++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:04:241₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
5219148681807756499
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"app/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.phpX4348-zsh+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976+++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:04:241₴1ec2-user@ip-10-30-140-...₴7...
|
85737
|
NULL
|
NULL
|
NULL
|
|
85738
|
2939
|
9
|
2026-05-28T13:04:21.319087+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973461319_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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...
|
[{"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","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}]...
|
-824022620702545522
|
-9103533727753729596
|
visual_change
|
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
rapstomEV favscojs ~ViewCooc#12121 on JY-20963-fox-hС НttpIntegrations@ interactionsJobsO MailC Modelsanoureatonsvoseivers© SocialAccountObserverTest,;C UserObserverTest.php€ UserRoleObserverTest.phpPolcies>EACtVIYActivityProviders@ CalendarTeonterenco•RullmeenClose# Copper@ HubspotListenersPipedriveSalesforce• FieidsOpportunityMatcherOpportunitySyncStrateProspectSearchStrateg& Service Traits© ClientTest.php© DecorateActivity Test.p© DeleteObjects TraitTest© FieidDefinitions Test.ph© GetActivityFieidNameT© PayloadBullder Test.phyE QueryBullder Test.php© QueryHandler Test.php©QuerviteratorTest.ohr© QueryResultsTests.phpC Semceltestoo© SyncBatchRedisService@ RaseSeniiceTest oho(el CacherCrm Senvicaßeco?3g% 9Windowwnapers.ohyTeom.one©ActivityController.php8000A SF (iminny@localhost)ConsoNe (STAGING)DP000• TXAUtOvBY u.id, u.enail, u.name, u.softphone_number* fron teans where id = 1;A console (EUT8458185Y00Curssercelesexendsepublic function testFetchAndAssociateRelatedActivity(): voidSclient = Sthis->createMock( origingSpayLoadBuilder = Sthis->createMock( originalClassNgSpayLoadBuilder->nethod( constraClient::class):= PayloadBuilden::class);ScountriesMap = Sthis-›createMock( crigh/** Bvar ServicesMockObject SserviceMock */SserviceMock = Sthis->getMockßuilder( className: Service::class)->setConstructorArgs(ESclient.SoayLoadbuzloersevencurspaccherScountriesMap,Sthis->createMock( origina/ClassN>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo>mhodlfetchRelatedActivity")-sweeerumnia'Description' => 'Test description'.Steam = Sthis->createMock( originTean: :class);"aetattobute" oythitnroum"tear"oyna Return SteamPlaybook::class);Splaybook->method(toi.af2mdMOcLAd ~ ACCept Fle X- bX PeRet 5Mn ( 359u0DE nULU:SpLaybook-›method( constraint: 'qetActivityType')-›willReturn( value: Playbook::ACTIVITY_TYPE_EVENT):= 709710711=722733fron text_relays where created_at > *2026-85-01*)fron activities where user_id IN (7160, 18608) and created_at > '2026-85-22' order by id desc;* fron users where team_id = 1 and id IN (18608, 13934, 7160);* fron activities where user_id = 7160 order by id desc Linit 10;* fron teans where id = 1117:fron activity_search_filters nhere activity_search_id IN (88882, 88902)TO0У L7Thu 28 May 16:04:20ServiceTestCascadeles orchwerwicee+0.decker nxe dovkces/cr/5 best ree/Servicee/31.php hervendsr/orsepontact: 2261PHPUnit 11.5.55 by Sebastian Bergnann and contributors.PHP 8.S.Sconteouratciont no.e/tminayohounsx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet me also quickly run the full ServiceTest to confirm nothing is broken:o desterext deckee/er/ lestore Serviceestphg s h ventaen -2/b3n/phpunitPHpunit 11.5.55 by Sebastzan Beramann and contributors.Configuration: /hose/jiminny/phpunit.xmlD.•DODOD..[PASSWORD_DOTS]D000.DD[PASSWORD_DOTS]•• 65 / 73 ( 894Time: 00:21.744, Memory: 94.00 MBA.7s tests pass. Herc's a summary of what was added:oo eoesnewssThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7parseContactPhone•testParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?"esParsccontad Phontwnexens ton -Tmoer winleroconttoty erracthe exensotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobitetestParsctontae Nonathaiddwuher - Eo numoee teturnd noek•testParseContactMobileIsTruncatedTo25Chars - Number longer than 25 chars gets truncated (Str:: 1iml•testParseContactMob{leW{thCountryCode - Local UK mobile resolved to +44. using country code1tile +80 2Accept allAsk anything (XOL)" PodnAdhotvutwdeurlatmekelwhireh2 4 space:...
|
85736
|
NULL
|
NULL
|
NULL
|
|
85737
|
2938
|
7
|
2026-05-28T13:04:19.445089+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973459445_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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","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
iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER881DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:04:191₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85736
|
2939
|
8
|
2026-05-28T13:04:19.339867+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973459339_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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...
|
[{"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","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}]...
|
9087091289234339902
|
-4023455704353896256
|
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
rapstomEV favscojs ~ViewCooc#12121 on JY-20963-fox-hС НttpIntegrations@ interactionsJobsO MailC Modelsanoureatonsvoseivers© SocialAccountObserverTest,;C UserObserverTest.phpE UserRoleObserverTest.phpPolcies>EACtVIYActivityProviders@ CalendarTeonterenco•RullmeenClose& Copper@ HubspotListenersPipedriveSalesforce• FieidsOpportunityMatcherOpportunitySyncStrateProspectSearchStrateg& Service Traits© ClientTest.php© DecorateActivity Test.p© DeleteObjects TraitTest© FieidDefinitions Test.ph© GetActivityFieidNameT© PayloadBullder Test.phyE QueryBullder Test.php© QueryHandler Test.php©QuerviteratorTest.ohr© QueryResultsTests.phpC Semceltestoo© SyncBatchRedisService@ RaseSeniiceTest oho(el CachedCrm Senvicaheroe)3g% 9Windowwnapers.ohyTeom.one©ActivityController.phpuCicheoneA SF (iminny@localhost)A console [STAGING)D8.Ty: Autowcreated_at > DATE_SUB(NOW(), INTERVAL 38 DAY)BY u.id, v.enail, U.name, U.softphone_number• • 0RurU ServiceTest xCG SmvOErO:~ v Test Resultsconsole [PROD] x © Service.phpA console (EUT045 A1 441 Y66 Acusesinuceleeelexendsesttpublic function testFetchAndAssociateRelatedActivity(): voidSclient = Sthis->createMock( originsSpayLoadBuilder = Sthis->createMock( originalClassNgClient::class):= PayloadBuilden::class);SpayLoadBuilder->nethod( constra->willReturnCallback(function (Sactivity, Spayload) (...H):ScountriesMap = Sthis->createMock( orighCountriesMap::class);Dispatcher: :class):=714—717E 718/** Bvar ServicesMockObject SserviceMock */SserviceMock = Sthis->getMockßuilder( className: Service: :class)->setConstructorArgs(ESclient.SoayLoadbuzloersevencurspaccherScountriesMap,Sthis->createMock( origina/ClassNProspectPhotoPathService::class),i gerltybokcatogoryi , ptsteifecere ) m>oncynechodstecchketacecacc.vzcv→>аскносkон=wcthoekoseyocerReiaho>oneo->mnadl cifetchRelatedActivity")-sweeerumnia=733'Description' => 'Test description'.Steam = Sthis-›createMock( originTean: :class);"aetattoibute"oythltearoum"tean"oyil Return SteamINEEERO&SPlaybook::class);Splaybook->method(toi.af 2mdMOcLAd ~ ACCept Fle X- bX PeRet 5Mn ( 359u0DE nULU:SpLaybook-›method( constraint: 'getActivityType') -›willReturn( value: PLaybook::ACTIVITY_TYPE_EVENT):v 73 tests passed 73 tests total, 2 sec 290 ms[docker-compose://[/Users/Lukas/jiminny/infrastructure/dev/docker/docker-compose.ymU):Zamp/]:php ./vendor/bin/phpunit --configuration phpunit.xml --filter Tests|\Unit||Servicesl\Testing started at 16:04 ….WARN[6000] /Users/lukas/jiminny/infrastructure/dev/docker/docker-compose.ynl: the attribute "version' is obsolete, it will be ignored, please renove it to avoid potential confusiPHPUnst 11.5.55 by Sebastion Bergnann and contributors.PuntindePHp 8.5,SConfiguration: /hone/jininny/phpunit.xmlsino: 88:89-866. Menory: 94.00M:There was 1 PHPUnit test runner warning:1) No code coverage driver availableOK, but there were issues!Tests: 73, Assertions: 300, PHPUnit Warnängs: 1, PHPUnit Deprecations: 17.What's next:Debug this Compose error with Gordon » docker ai "help me fix this compose erron"Process finished with exit code 1*Tron licand whene nacd iuke lSuhnetemgti*Thor tasne whendr14* fron activity_searches where user_id = 31854:*Eoon sctkusty coanch Eilitane mhans actkusty canoch 4a TM CRRRR2 RRO02< 50 MNoo Inu comoy 1o:04.1eServiceTestCascadeles orcesirwich+0.deckeunxes deckees/cr/3 best ree/Servicer/31.php -, Ptervenesr/orsepontact: 2561PHPUnit 11.5.55 by Sebastian Bergnann and contributors.11/ 11 (100%2 sec 290 ms1tile +80 2Ask anything (XOL)c HodeAdhotv-existing PHPUnit warnings-=/bin/phpunst..% / 73 (1804)s for the happy paths - added 7y, ext is nutletacehe exensotan 10 chars gets truncated (Str::tMueine countrcon5 chars gets truncated (Str:: lint444. using country codeB ul -RT RetetalAcceot allIModeuralaimeehies*4 space...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85735
|
2939
|
7
|
2026-05-28T13:04:04.730564+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973444730_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
Rerun 'PHPUnit: ServiceTest'
Debug 'ServiceTest'
Stop 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
...
|
[{"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","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":"Rerun 'PHPUnit: 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":"Stop 'ServiceTest'","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":"More Actions","depth":6,"bounds":{"left":0.9494681,"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":"Built-in Preview","depth":4,"bounds":{"left":0.35904256,"top":0.15562649,"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":"Chrome","depth":4,"bounds":{"left":0.36768618,"top":0.15562649,"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":"Firefox","depth":4,"bounds":{"left":0.37632978,"top":0.15562649,"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":"Safari","depth":4,"bounds":{"left":0.3849734,"top":0.15562649,"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":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"32","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.010305851,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"81","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.009640957,"height":0.0},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"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 Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","depth":4,"bounds":{"left":0.13863032,"top":0.12210695,"width":0.3550532,"height":0.87789303},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Salesforce;\n\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Events\\Dispatcher;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Jiminny\\Component\\Country\\CountriesMap;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Enums\\CrmObject;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\NoResultsException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\TeamSettings;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\Crm\\ContactRoleRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Services\\Avatar\\ProspectPhotoPathService;\nuse Jiminny\\Services\\Crm\\Salesforce\\Client;\nuse Jiminny\\Services\\Crm\\Salesforce\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryBuilder;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryHandler;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryIterator;\nuse Jiminny\\Services\\Crm\\Salesforce\\QueryResults;\nuse Jiminny\\Services\\Crm\\Salesforce\\Service;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse Tests\\TestCase;\nuse Tests\\Unit\\Traits\\TestPrivateMethod;\n\nclass ServiceTest extends TestCase\n{\n use TestPrivateMethod;\n\n public function testFetchAndAssociateRelatedActivity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $payloadBuilder->method('addCustomLogicFieldsPayload')\n ->willReturnCallback(function ($activity, $payload) {\n return $payload;\n });\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])\n ->getMock();\n\n $serviceMock->expects($this->once())\n ->method('fetchRelatedActivity')\n ->willReturn([\n 'Id' => 'testId',\n 'Type' => null,\n 'OwnerId' => 'testerUser',\n 'Description' => 'Test description',\n ]);\n\n $user = $this->createMock(User::class);\n $team = $this->createMock(Team::class);\n $user->method('getAttribute')->with('team')->willReturn($team);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityField')->willReturn(null);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('getPlaybookCategory');\n\n $serviceMock->expects($this->never())\n ->method('updateRecord');\n\n $fieldDataRepository = $this->createMock(FieldDataRepository::class);\n $fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));\n app()->instance(FieldDataRepository::class, $fieldDataRepository);\n\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $config->method('profiles')->willReturn($profilesRelation);\n\n $serviceMock->config = $config;\n $serviceMock->profile = null;\n\n $actualStartTime = \\Carbon\\Carbon::now();\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['update', 'hasProspect'])\n ->getMock();\n\n $activity->method('update')->willReturn(true);\n $activity->method('hasProspect')->willReturn(true);\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->provider = Activity::PROVIDER_TWILIO;\n $activity->lead_id = 1;\n $activity->user_id = 0;\n $activity->id_string = 'test-activity-id';\n $activity->user = $user;\n\n $activity->actual_start_time = $actualStartTime;\n $activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';\n\n app()->bind(PlaybookResolver::class, function () use ($user) {\n $playbook = $this->createMock(Playbook::class);\n $playbookResolver = $this->createMock(PlaybookResolver::class);\n $playbookResolver->expects($this->once())\n ->method('resolvePlaybookByUser')\n ->with($user)\n ->willReturn($playbook);\n\n return $playbookResolver;\n });\n\n $data = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertInstanceOf(Activity::class, $data);\n $this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());\n $this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());\n }\n\n public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])\n ->getMock();\n\n $user = $this->createMock(User::class);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n $playbook->method('getId')->willReturn(123);\n\n $serviceMock->expects($this->once())\n ->method('getPlaybook')\n ->with($user)\n ->willReturn($playbook);\n\n $serviceMock->expects($this->never())\n ->method('fetchRelatedActivity');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(true);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n $activity->user = $user;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_SOFTPHONE;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $serviceMock = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->getMock();\n\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = null;\n $activity->scheduled_start_time = null;\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['getPlaybook'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('getPlaybook');\n\n $activity = $this->getMockBuilder(Activity::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['hasProspect', 'getUuid'])\n ->getMock();\n\n $activity->method('hasProspect')->willReturn(false);\n $activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');\n $activity->type = Activity::TYPE_CONFERENCE;\n $activity->actual_start_time = \\Carbon\\Carbon::now();\n\n $result = $serviceMock->fetchAndAssociateRelatedActivity($activity);\n\n $this->assertNull($result);\n }\n\n public function testMatchExactlyByEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods([])\n ->getMock();\n\n $profile = new Profile();\n $profile->setAttribute('id', bin2hex(random_bytes(8)));\n $serviceMock->profile = $profile;\n\n $team = $this->createMock(Team::class);\n $serviceMock->team = $team;\n\n $data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . 'test_email@testserver.com');\n\n $this->assertEquals(null, $data);\n }\n\n public function testMatchDomainFromEmail(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $config = $this->createMock(Configuration::class);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('search')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCrmData'])\n ->getMock();\n\n $profile = new Profile();\n $profile->account_fields = 'Field1, Field2, Field3';\n $serviceMock->profile = $profile;\n\n $serviceMock->expects($this->once())\n ->method('convertCrmData')\n ->willReturn(['test']);\n\n $this->app->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildMatchByDomainQuery')\n ->with('test_email@testserver.com')\n ->willReturn('FIND {test_email@testserver.com} IN ALL FIELDS RETURNING Account(Id)');\n\n return $queryBuilder;\n });\n\n $team = $this->createMock(Team::class);\n\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $data = $serviceMock->matchByDomain('test_email@testserver.com');\n\n $this->assertEquals(['test'], $data);\n }\n\n public function testBuildTaskSearchFields(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)\n );\n\n $fields = $service->buildTaskSearchFields();\n\n $expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];\n\n $this->assertEquals($expectedFields, $fields);\n }\n\n public function testMapCrmObjects(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),\n );\n\n $sampleTask = [\n 'WhoId' => '003sampleWhoId',\n 'AccountId' => 'sampleAccountId',\n 'WhatId' => 'sampleWhatId',\n ];\n\n $activityData = $service->mapCrmObjects($sampleTask);\n\n $expectedActivityData = [\n 'contact' => '003sampleWhoId',\n 'account' => 'sampleAccountId',\n 'opportunity' => 'sampleWhatId',\n ];\n\n $this->assertEquals($expectedActivityData, $activityData);\n }\n\n public function testGetInstalledAppVersion(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n $queryIterator = $this->createMock(QueryIterator::class);\n $queryIterator->expects($this->any())\n ->method('current')->willReturn([\n 'SubscriberPackageVersion' => [\n 'MajorVersion' => '1',\n 'MinorVersion' => '0',\n 'PatchVersion' => '1',\n 'BuildNumber' => '0',\n ],\n ]);\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('metadata')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))\n ->getMock();\n\n $version = $serviceMock->getInstalledAppVersion();\n\n $this->assertEquals('1010', $version);\n }\n\n public function testSyncProfiles(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testSyncProfilesEmailIsNull(): void\n {\n $userToSearch = $this->createMock(User::class);\n\n $salesforceUser = [\n 'Email' => null,\n ];\n\n app()->bind(QueryBuilder::class, function () {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with(null)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->exactly(2))\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $team = $this->createMock(Team::class);\n $user = $this->createMock(User::class);\n $this->mockTeamRepository($team, $salesforceUser, $user, false);\n\n $config = $this->createMock(Configuration::class);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n\n $profile = $serviceMock->syncProfiles(null);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesUserToSearchMatchesCurrentUser(): void\n {\n $userToSearch = $this->createMock(User::class);\n $userToSearch->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $team = $this->createMock(Team::class);\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n ];\n\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->with('SELECT * FROM Users')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n\n $user = $this->createMock(User::class);\n $user->expects($this->exactly(2))\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user);\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertInstanceOf(Profile::class, $profile);\n }\n\n public function testSyncProfilesWithCustomValidation(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n $config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()\n ->method('getId')\n ->willReturn(1);\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'CustomValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $user = $this->createMock(User::class);\n $user->expects($this->once())\n ->method('getId')\n ->willReturn(123);\n\n $this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);\n\n $this->mockProfileRepository($user);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $profile = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($profile);\n }\n\n public function testSyncProfilesWithCustomValidationFailing(): void\n {\n $userToSearch = null;\n\n $team = $this->createMock(Team::class);\n $config = $this->createMockedConfiguration();\n\n $salesforceUser = [\n 'Email' => 'test@example.com',\n 'UserPreferencesLightningExperiencePreferred' => true,\n 'CallCenterId' => '123',\n 'Id' => '456',\n 'ProfileId' => '789',\n 'CustomField' => 'WrongValue',\n ];\n\n $customRules = [\n ['field' => 'CustomField', 'value' => 'CustomValue'],\n ];\n\n $this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);\n\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->never())\n ->method('updateOrCreateProfile');\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $team;\n $serviceMock->config = $config;\n $result = $serviceMock->syncProfiles($userToSearch);\n\n $this->assertNull($result);\n }\n\n public function testGetContactRolesFromCrm(): void\n {\n $contactRoles = [\n [\n 'Id' => '1',\n 'ContactId' => 'Contact1',\n 'OpportunityId' => 'Opportunity1',\n 'Opportunity' => ['OwnerId' => 'Owner1'],\n 'IsPrimary' => true,\n 'Role' => 'Decision Maker',\n ],\n ];\n\n $expectedResponse = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n $this->bindQueryIterator($contactRoles);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals($expectedResponse, $data);\n }\n\n public function testGetContactRolesFromCrmNoResult(): void\n {\n $this->bindQueryIterator([]);\n\n $serviceMock = $this->getServiceMock();\n\n $data = $serviceMock->getContactRolesFromCrm(now()->subDay());\n\n $this->assertEquals([], $data);\n }\n\n public function testSyncContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'contactId' => 'Contact1',\n 'opportunityId' => 'Opportunity1',\n 'ownerId' => 'Owner1',\n 'isPrimary' => true,\n 'role' => 'Decision Maker',\n ],\n ];\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('saveContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock([\n 'getContactRolesFromCrm',\n 'syncRemotelyDeletedContactRoles',\n 'syncContact',\n 'syncOpportunity',\n ]);\n\n $config = $this->createMock(Configuration::class);\n $hasMany = $this->createMock(HasManyExtended::class);\n $hasMany->expects($this->exactly(2))\n ->method('where')\n ->willReturn($hasMany);\n\n $hasMany->expects($this->exactly(2))\n ->method('first')\n ->willReturn(\n $this->createMock(Contact::class),\n $this->createMock(Opportunity::class)\n );\n\n $config->expects($this->once())\n ->method('contacts')\n ->willReturn($hasMany);\n $config->expects($this->once())\n ->method('opportunities')\n ->willReturn($hasMany);\n\n $serviceMock->config = $config;\n\n $serviceMock->expects($this->once())\n ->method('getContactRolesFromCrm')\n ->willReturn($contactRoles);\n\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedContactRoles');\n\n $data = $serviceMock->syncContactRoles(now()->subDay());\n\n $this->assertEquals(1, $data);\n }\n\n public function testSyncRemotelyDeletedContactRoles(): void\n {\n $contactRoles = [\n [\n 'id' => '1',\n 'crm_provider_id' => '1',\n ],\n ];\n\n app()->bind(QueryHandler::class, function () use ($contactRoles) {\n $queryResults = new QueryResults($contactRoles, 1, true, null);\n\n $handler = $this->createMock(QueryHandler::class);\n $handler->method('queryDeleted')\n ->willReturn($queryResults);\n\n return $handler;\n });\n\n app()->bind(ContactRoleRepository::class, function () {\n $contactRoleRepository = $this->createMock(ContactRoleRepository::class);\n $contactRoleRepository->expects($this->once())\n ->method('deleteContactRoles');\n\n return $contactRoleRepository;\n });\n\n $serviceMock = $this->getServiceMock();\n $serviceMock->team = $this->createMock(Team::class);\n\n $data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);\n\n $this->assertTrue($data);\n }\n\n private function bindQueryIterator(array $queryResult): void\n {\n /** @var Client $client */\n $client = $this->createMock(Client::class);\n $queryIterator = new QueryIterator(\n $client,\n new QueryResults($queryResult, 1, true, null)\n );\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n public static function getOpportunitySortOrderDataProvider(): array\n {\n return [\n 'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],\n 'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],\n 'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],\n 'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],\n 'default' => ['unknown', ['LastModifiedDate DESC', true]],\n ];\n }\n\n private function createMockedConfiguration(): Configuration\n {\n $config = $this->createMock(Configuration::class);\n $profilesRelation = $this->getMockBuilder(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class)\n ->disableOriginalConstructor()\n ->onlyMethods(['get'])\n ->addMethods(['where', 'first'])\n ->getMock();\n $profilesRelation->method('where')->willReturnSelf();\n $profilesRelation->method('get')->willReturn(collect([]));\n $profilesRelation->method('first')->willReturn(null);\n $config->method('profiles')->willReturn($profilesRelation);\n\n return $config;\n }\n\n private function getServiceMock(array $onlyMethods = []): MockObject&Service\n {\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods($onlyMethods)\n ->getMock();\n\n $serviceMock->profile = $this->createMock(Profile::class);\n\n return $serviceMock;\n }\n\n private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void\n {\n app()->bind(QueryBuilder::class, function () use ($userToSearch) {\n $queryBuilder = $this->createMock(QueryBuilder::class);\n $queryBuilder->expects($this->once())\n ->method('buildGetUsersQuery')\n ->with($userToSearch)\n ->willReturn('SELECT * FROM Users');\n\n return $queryBuilder;\n });\n\n $queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));\n\n app()->bind(QueryHandler::class, function () use ($queryIterator) {\n $handler = $this->createMock(QueryHandler::class);\n $handler->expects($this->any())\n ->method('query')\n ->willReturn($queryIterator);\n\n return $handler;\n });\n }\n\n private function mockTeamRepository(\n Team $team,\n array $salesforceUser,\n ?User $user = null,\n bool $userSearch = true,\n array $customRules = []\n ): void {\n $teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);\n\n if ($userSearch) {\n $teamRepository->expects($this->once())\n ->method('findActiveTeamMemberByEmail')\n ->with($team, $salesforceUser['Email'])\n ->willReturn($user);\n }\n\n $teamSettings = $this->createMock(TeamSettings::class);\n $teamSettings->method('getValueType')\n ->willReturn('array');\n\n $teamSettings->method('getValue')\n ->willReturn(json_encode($customRules));\n\n $teamRepository->expects($this->once())\n ->method('getTeamSetting')\n ->with($team, 'custom_profile_validation')\n ->willReturn($teamSettings);\n\n app()->bind(TeamRepository::class, function () use ($teamRepository) {\n return $teamRepository;\n });\n }\n\n private function mockProfileRepository(User $user): void\n {\n $profileRepository = $this->createMock(ProfileRepository::class);\n $profileRepository->expects($this->once())\n ->method('updateOrCreateProfile')\n ->with(\n $user,\n [\n 'crm_configuration_id' => 1,\n 'crm_provider_id' => '456',\n ],\n [\n 'user_id' => 123,\n 'edition' => Profile::EDITION_LIGHTNING,\n 'has_external_cti' => true,\n 'crm_profile_id' => '789',\n ]\n )\n ->willReturn(new Profile());\n\n $this->app->instance(ProfileRepository::class, $profileRepository);\n }\n\n public function testBuildEnhancedNoteDecodesHtmlEntities(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-123');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');\n\n $bodyWithEntities = 'Welch's current challenges and Facebook's Club';\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithEntities,\n 'object-id-789',\n ]);\n\n $this->assertEquals('note-id-123', $result);\n }\n\n public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-456');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<script>', $decoded);\n\n return 'note-id-456';\n }\n\n return 'link-id-789';\n });\n\n $bodyWithMixedContent = \"Welch's and <script>alert('xss')</script>\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithMixedContent,\n 'object-id-123',\n ]);\n\n $this->assertEquals('note-id-456', $result);\n }\n\n public function testBuildEnhancedNoteConvertsLineBreaks(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-789');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringNotContainsString('<br />', $decoded);\n\n return 'note-id-789';\n }\n\n return 'link-id-012';\n });\n\n $bodyWithLineBreaks = \"Line 1\\nLine 2\\nLine 3\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Test Title',\n $bodyWithLineBreaks,\n 'object-id-456',\n ]);\n\n $this->assertEquals('note-id-789', $result);\n }\n\n public function testBuildEnhancedNoteHandlesComplexScenario(): void\n {\n $service = $this->getServiceMock(['createRecord']);\n\n $profile = new Profile();\n $profile->setAttribute('crm_provider_id', 'owner-complex');\n $service->profile = $profile;\n\n $service->expects($this->exactly(2))\n ->method('createRecord')\n ->willReturnCallback(function ($type, $data) {\n if ($type === 'ContentNote') {\n $decoded = base64_decode($data['Content']);\n\n $this->assertStringContainsString(\"Welch's\", $decoded);\n $this->assertStringContainsString(\"Facebook's Club\", $decoded);\n $this->assertStringContainsString(\"Arctics'\", $decoded);\n $this->assertStringNotContainsString(''', $decoded);\n $this->assertStringNotContainsString('&#039;', $decoded);\n $this->assertStringContainsString('<br>', $decoded);\n $this->assertStringContainsString('<', $decoded);\n $this->assertStringContainsString('>', $decoded);\n\n return 'note-complex';\n }\n\n return 'link-complex';\n });\n\n $complexBody = \"Summary:\\n---------\\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\\n\\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.\";\n\n $result = $this->invokePrivateMethod('buildEnhancedNote', $service, [\n 'Jiminny Transcription Summary',\n $complexBody,\n 'task-id-001',\n ]);\n\n $this->assertEquals('note-complex', $result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-123');\n $serviceMock->team = $team;\n\n // Expect syncRemotelyDeletedObjects to be called once and succeed\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not throw any exceptions\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::ACCOUNT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-456');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $reflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Sync failed due to API error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::CONTACT)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct message and parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'contact',\n 'teamId' => 'team-uuid-456',\n 'reason' => 'Sync failed due to API error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::CONTACT);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-789');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflection = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Network timeout');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with(\\Jiminny\\Enums\\CrmObject::OPPORTUNITY)\n ->willThrowException($exception);\n\n // Additional log parameters\n $logParams = [\n 'syncType' => 'full',\n 'batchSize' => 100,\n ];\n\n // Expect warning to be logged with merged parameters\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => 'opportunity',\n 'teamId' => 'team-uuid-789',\n 'reason' => 'Network timeout',\n 'syncType' => 'full',\n 'batchSize' => 100,\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n // Should not re-throw the exception, just log it\n $method->invoke($serviceMock, \\Jiminny\\Enums\\CrmObject::OPPORTUNITY, $logParams);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n /**\n * @dataProvider crmObjectProvider\n */\n public function testSyncRemotelyDeletedObjectsWithErrorHandlingDifferentCrmObjects(\\Jiminny\\Enums\\CrmObject $crmObject): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['syncRemotelyDeletedObjects'])\n ->getMock();\n\n // Mock team\n $team = $this->createMock(Team::class);\n $team->method('getUuid')->willReturn('team-uuid-test');\n $serviceMock->team = $team;\n\n // Mock logger to verify warning is logged\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n\n // Use reflection to set the protected logger property\n $loggerReflectionClass = new \\ReflectionClass($serviceMock);\n $loggerProperty = $loggerReflectionClass->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($serviceMock, $logger);\n\n $exception = new \\Exception('Test error');\n\n // Expect syncRemotelyDeletedObjects to throw an exception\n $serviceMock->expects($this->once())\n ->method('syncRemotelyDeletedObjects')\n ->with($crmObject)\n ->willThrowException($exception);\n\n // Expect warning to be logged with correct entity type\n $logger->expects($this->once())\n ->method('warning')\n ->with(\n '[Salesforce] Remotely deleted objects sync failed',\n [\n 'objectType' => $crmObject->value,\n 'teamId' => 'team-uuid-test',\n 'reason' => 'Test error',\n ]\n );\n\n // Call the protected method using reflection\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $crmObject);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testHandleObjectDeletionWithDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Account::class);\n $crmData = ['IsDeleted' => true];\n\n $serviceMock->expects($this->once())\n ->method('deleteCrmObject')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testHandleObjectDeletionWithNonDeletedEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['deleteCrmObject'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Contact::class);\n $crmData = ['IsDeleted' => false];\n\n $serviceMock->expects($this->never())\n ->method('deleteCrmObject');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('handleObjectDeletion');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity, $crmData);\n }\n\n public function testDeleteCrmObjectWithValidEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $entity = $this->createMock(\\Jiminny\\Models\\Lead::class);\n $entity->expects($this->once())->method('delete');\n\n $serviceMock->expects($this->once())\n ->method('dispatchDeleteCrmObjectJob')\n ->with($entity);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, $entity);\n }\n\n public function testDeleteCrmObjectWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n /** @var Service&MockObject $serviceMock */\n $serviceMock = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['dispatchDeleteCrmObjectJob'])\n ->getMock();\n\n $serviceMock->expects($this->never())\n ->method('dispatchDeleteCrmObjectJob');\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($serviceMock);\n $method = $reflection->getMethod('deleteCrmObject');\n $method->setAccessible(true);\n\n $method->invoke($serviceMock, null);\n }\n\n public function testDispatchDeleteCrmObjectJobWithNullEntity(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n $method->setAccessible(true);\n\n // Should return early without dispatching - no exception expected\n $method->invoke($service, null);\n\n $this->assertTrue(true); // Test completed successfully\n }\n\n public function testDispatchDeleteCrmObjectJobWithUnsupportedEntity(): void\n {\n $this->expectException(\\TypeError::class);\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n $unsupportedEntity = $this->createMock(\\stdClass::class);\n\n // Use reflection to call the protected method\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('dispatchDeleteCrmObjectJob');\n\n // This will throw TypeError due to union type constraint\n $method->invoke($service, $unsupportedEntity);\n }\n\n public function testHandleEntityDeletionByProviderIdMethodExists(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Test that the method exists and is accessible via reflection\n $reflection = new \\ReflectionClass($service);\n $method = $reflection->getMethod('handleEntityDeletionByProviderId');\n $method->setAccessible(true);\n\n // Verify method exists and has correct parameters\n $this->assertTrue($method->isProtected());\n $this->assertEquals(2, $method->getNumberOfParameters());\n\n $parameters = $method->getParameters();\n $this->assertEquals('targetEntity', $parameters[0]->getName());\n $this->assertEquals('crmData', $parameters[1]->getName());\n }\n\n public function testSyncRemotelyDeletedObjectsWithNoResults(): void\n {\n // Create a real service instance to avoid mock property issues\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to throw NoResultsException\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willThrowException(new NoResultsException('No results'));\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithEmptyResults(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return empty results\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn([]);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Opportunity')\n ->willReturn($queryResult);\n\n // Set the queryHandler using reflection on the real service\n $reflection = new \\ReflectionClass($service);\n $queryHandlerProperty = $reflection->getProperty('queryHandler');\n $queryHandlerProperty->setAccessible(true);\n $queryHandlerProperty->setValue($service, $queryHandler);\n\n $result = self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::OPPORTUNITY]);\n\n $this->assertFalse($result);\n }\n\n public function testSyncRemotelyDeletedObjectsWithUnsupportedCrmObject(): void\n {\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = new Service(\n client: $client,\n payloadBuilder: $payloadBuilder,\n eventDispatcher: $eventDispatcher,\n countriesMap: $countriesMap,\n prospectPhotoPathService: $prospectPhotoPathService,\n );\n\n // Mock queryHandler to return some deleted objects so we reach the match statement\n $deletedObjects = [\n ['id' => 'task1'],\n ['id' => 'task2'],\n ];\n $queryResult = $this->createMock(QueryResults::class);\n $queryResult->method('getResults')->willReturn($deletedObjects);\n\n $queryHandler = $this->createMock(QueryHandler::class);\n $queryHandler->expects($this->once())\n ->method('queryDeleted')\n ->with('Task') // ucfirst('task') = 'Task'\n ->willReturn($queryResult);\n\n self::setPrivateProperty($service, 'queryHandler', $queryHandler);\n\n $this->expectException(InvalidArgumentException::class);\n $this->expectExceptionMessage('Unsupported CrmObject: task');\n\n self::invokePrivateMethod('syncRemotelyDeletedObjects', $service, [CrmObject::TASK]);\n }\n\n public static function crmObjectProvider(): array\n {\n return [\n 'Account' => [CrmObject::ACCOUNT],\n 'Contact' => [CrmObject::CONTACT],\n 'Lead' => [CrmObject::LEAD],\n 'Opportunity' => [CrmObject::OPPORTUNITY],\n ];\n }\n\n public function testVerifyTaskExistsReturnsTrue(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsTrueForEvent(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:event-123', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('event-123');\n $activity->method('getId')->willReturn(456);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Event', 'event-123', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'event-123', 'IsDeleted' => false]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenDeleted(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-456', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-456');\n $activity->method('getId')->willReturn(789);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-456', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-456', 'IsDeleted' => true]);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNotFound(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-999', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-999');\n $activity->method('getId')->willReturn(999);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-999', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpNotFoundException('Task not found'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsReturnsFalseWhenNoPlaybook(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-no-playbook', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-no-playbook');\n $activity->method('getId')->willReturn(111);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn(null);\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testVerifyTaskExistsThrowsExceptionForTransientErrors(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-error', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-error');\n $activity->method('getId')->willReturn(888);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-error', ['Id', 'IsDeleted'])\n ->willThrowException(new \\RuntimeException('Network timeout'));\n\n $this->expectException(\\RuntimeException::class);\n $this->expectExceptionMessage('Network timeout');\n\n $service->verifyTaskExists($activity);\n }\n\n public function testVerifyTaskExistsCachesResults(): void\n {\n $cachedValue = null;\n Cache::shouldReceive('remember')\n ->twice()\n ->with('crm_task_exists:123:task-cached', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(function ($key, $ttl, $callback) use (&$cachedValue) {\n if ($cachedValue === null) {\n $cachedValue = $callback();\n }\n\n return $cachedValue;\n });\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-cached');\n $activity->method('getId')->willReturn(555);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-cached', ['Id', 'IsDeleted'])\n ->willReturn(['Id' => 'task-cached', 'IsDeleted' => false]);\n\n $result1 = $service->verifyTaskExists($activity);\n $result2 = $service->verifyTaskExists($activity);\n\n $this->assertTrue($result1);\n $this->assertTrue($result2);\n }\n\n public function testVerifyTaskExistsReturnsFalseForHttpBadRequestException(): void\n {\n Cache::shouldReceive('remember')\n ->once()\n ->with('crm_task_exists:123:task-400', 86400, \\Mockery::type('Closure'))\n ->andReturnUsing(fn ($key, $ttl, $callback) => $callback());\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $eventDispatcher = $this->createMock(Dispatcher::class);\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['getRecord', 'getPlaybookFromActivity'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->method('getId')->willReturn(123);\n\n self::setPrivateProperty($service, 'config', $config);\n\n $activity = $this->createMock(Activity::class);\n $activity->method('getCrmProviderId')->willReturn('task-400');\n $activity->method('getId')->willReturn(400);\n\n $playbook = $this->createMock(Playbook::class);\n $playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);\n\n $service->expects($this->once())\n ->method('getPlaybookFromActivity')\n ->with($activity)\n ->willReturn($playbook);\n\n $service->expects($this->once())\n ->method('getRecord')\n ->with('Task', 'task-400', ['Id', 'IsDeleted'])\n ->willThrowException(new \\Jiminny\\Exceptions\\HttpBadRequestException('Bad request'));\n\n $result = $service->verifyTaskExists($activity);\n\n $this->assertFalse($result);\n }\n\n public function testImportOpportunitySkipsWhenNoProfileAndNoAccount(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-1',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-no-profile',\n // No AccountId\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $countriesMap = $this->createMock(CountriesMap::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-no-profile')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-1']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property to avoid \"must not be accessed before initialization\" error\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsNullWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('handleEntityDeletionByProviderId')\n ->with($contactsRelation, $crmData);\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactSkipsWritesWhenIsDeleted(): void\n {\n $crmData = ['Id' => 'SF-CON-DEL-2', 'IsDeleted' => true];\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n\n $config = $this->createMock(Configuration::class);\n $config->expects($this->once())->method('contacts')->willReturn($contactsRelation);\n\n $service = $this->getServiceMock(['handleEntityDeletionByProviderId']);\n $service->config = $config;\n\n $service->expects($this->once())->method('handleEntityDeletionByProviderId');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsTrashedContactAsNull(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-TRASHED',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Trashed Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(true);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n\n public function testImportContactReturnsContactWhenActive(): void\n {\n $crmData = [\n 'Id' => 'SF-CON-ACTIVE',\n 'IsDeleted' => false,\n 'OwnerId' => null,\n 'Name' => 'Active Contact',\n ];\n\n $contact = $this->createMock(Contact::class);\n $contact->method('trashed')->willReturn(false);\n\n $contactsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first', 'withTrashed'])\n ->onlyMethods(['updateOrCreate'])\n ->getMock();\n $contactsRelation->method('where')->willReturnSelf();\n $contactsRelation->method('withTrashed')->willReturnSelf();\n $contactsRelation->method('first')->willReturn(null);\n $contactsRelation->method('updateOrCreate')->willReturn($contact);\n\n $config = $this->createMock(Configuration::class);\n $config->method('contacts')->willReturn($contactsRelation);\n $config->method('accounts')->willReturn($contactsRelation);\n\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n $prospectPhotoPathService->method('getOrGeneratePhotoPath')->willReturn('photo.jpg');\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $this->createMock(CountriesMap::class),\n $prospectPhotoPathService,\n ])\n ->onlyMethods(['handleObjectDeletion'])\n ->getMock();\n\n $service->config = $config;\n $service->profile = $this->createMock(Profile::class);\n\n $team = $this->createMock(Team::class);\n $team->method('getAttribute')->with('id')->willReturn(1);\n $service->team = $team;\n\n $service->method('handleObjectDeletion');\n\n $result = self::invokePrivateMethod('importContact', $service, [$crmData]);\n\n $this->assertSame($contact, $result);\n }\n\n public static function resolveContactAccountProvider(): array\n {\n return [\n 'no AccountId returns null' => [[], null],\n 'AccountId present' => [['AccountId' => 'ACC-001'], 'ACC-001'],\n ];\n }\n\n /**\n * @dataProvider resolveContactAccountProvider\n */\n public function testResolveContactAccountWithNoAccountId(array $crmData, ?string $expectedId): void\n {\n $service = $this->getServiceMock(['syncAccount']);\n\n if ($expectedId === null) {\n $service->expects($this->never())->method('syncAccount');\n $config = $this->createMock(Configuration::class);\n $config->expects($this->never())->method('accounts');\n $service->config = $config;\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertNull($result);\n\n return;\n }\n\n $account = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->with('crm_provider_id', $expectedId)->willReturnSelf();\n $accountsRelation->method('first')->willReturn($account);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n $service->config = $config;\n\n $service->expects($this->never())->method('syncAccount');\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [$crmData]);\n $this->assertSame($account, $result);\n }\n\n public function testResolveContactAccountSyncsWhenNotFoundLocally(): void\n {\n $syncedAccount = $this->createMock(\\Jiminny\\Models\\Account::class);\n\n $accountsRelation = $this->getMockBuilder(HasMany::class)\n ->disableOriginalConstructor()\n ->addMethods(['where', 'first'])\n ->getMock();\n $accountsRelation->method('where')->willReturnSelf();\n $accountsRelation->method('first')->willReturn(null);\n\n $config = $this->createMock(Configuration::class);\n $config->method('accounts')->willReturn($accountsRelation);\n\n $service = $this->getServiceMock(['syncAccount']);\n $service->config = $config;\n\n $service->expects($this->once())\n ->method('syncAccount')\n ->with('ACC-MISSING')\n ->willReturn($syncedAccount);\n\n $result = self::invokePrivateMethod('resolveContactAccount', $service, [['AccountId' => 'ACC-MISSING']]);\n\n $this->assertSame($syncedAccount, $result);\n }\n\n public static function resolveContactCountryCodeProvider(): array\n {\n return [\n 'valid MailingCountryCode' => [['MailingCountryCode' => 'GB'], true, null, 'GB'],\n 'invalid MailingCountryCode falls to null' => [['MailingCountryCode' => 'XX'], false, null, null],\n 'no code, uses MailingCountry converted' => [['MailingCountry' => 'Germany'], null, 'DE', 'DE'],\n 'no code, country name null, uses account' => [['MailingCountry' => 'Unknown'], null, null, 'US'],\n 'no code, no country at all' => [[], null, null, null],\n ];\n }\n\n /**\n * @dataProvider resolveContactCountryCodeProvider\n */\n public function testResolveContactCountryCode(\n array $crmData,\n ?bool $countryExists,\n ?string $convertedCode,\n ?string $expected\n ): void {\n $countriesMap = $this->createMock(CountriesMap::class);\n if ($countryExists !== null) {\n $countriesMap->method('countryExists')->willReturn($countryExists);\n }\n\n $service = $this->getMockBuilder(Service::class)\n ->setConstructorArgs([\n $this->createMock(Client::class),\n $this->createMock(PayloadBuilder::class),\n $this->createMock(Dispatcher::class),\n $countriesMap,\n $this->createMock(ProspectPhotoPathService::class),\n ])\n ->onlyMethods(['convertCountryNameToCode'])\n ->getMock();\n\n $service->profile = $this->createMock(Profile::class);\n\n if (isset($crmData['MailingCountry'])) {\n $service->expects($this->once())\n ->method('convertCountryNameToCode')\n ->with($crmData['MailingCountry'])\n ->willReturn($convertedCode);\n } else {\n $service->expects($this->never())->method('convertCountryNameToCode');\n }\n\n $account = null;\n if ($expected === 'US') {\n $account = new \\Jiminny\\Models\\Account();\n $account->setAttribute('country_code', 'US');\n }\n\n $result = self::invokePrivateMethod('resolveContactCountryCode', $service, [$crmData, $account]);\n\n $this->assertSame($expected, $result);\n }\n\n public static function parseContactPhoneProvider(): array\n {\n return [\n 'empty Phone returns empty' => [['Phone' => ''], null, [[], null]],\n 'no Phone key returns empty' => [[], null, [[], null]],\n ];\n }\n\n /**\n * @dataProvider parseContactPhoneProvider\n */\n public function testParseContactPhoneWithEmptyPhone(array $crmData, ?string $countryCode, array $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactPhone', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactPhoneWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, [null, $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('+12025551234', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public function testParseContactPhoneWithExtension(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 42'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertSame('42', $ext);\n }\n\n public function testParseContactPhoneExtIsTruncatedTo10Chars(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '+12025551234 ext. 12345678901'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['US', $crmData]);\n\n $this->assertNotNull($ext);\n $this->assertLessThanOrEqual(10, strlen($ext));\n }\n\n public function testParseContactPhoneWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['Phone' => '02075551234'];\n\n [$parsedNumber, $ext] = self::invokePrivateMethod('parseContactPhone', $service, ['GB', $crmData]);\n\n $this->assertArrayHasKey('phone', $parsedNumber);\n $this->assertStringStartsWith('+44', $parsedNumber['phone']);\n $this->assertNull($ext);\n }\n\n public static function parseContactMobileProvider(): array\n {\n return [\n 'empty MobilePhone returns null' => [['MobilePhone' => ''], null, null],\n 'no MobilePhone key returns null' => [[], null, null],\n ];\n }\n\n /**\n * @dataProvider parseContactMobileProvider\n */\n public function testParseContactMobileWithEmptyPhone(array $crmData, ?string $countryCode, ?string $expected): void\n {\n $service = $this->getServiceMock();\n $result = self::invokePrivateMethod('parseContactMobile', $service, [$countryCode, $crmData]);\n $this->assertSame($expected, $result);\n }\n\n public function testParseContactMobileWithValidNumber(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '+12025550199'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertSame('+12025550199', $result);\n }\n\n public function testParseContactMobileIsTruncatedTo25Chars(): void\n {\n $service = $this->getServiceMock();\n $longNumber = '+1202555019912345678901234';\n $crmData = ['MobilePhone' => $longNumber];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, [null, $crmData]);\n\n $this->assertNotNull($result);\n $this->assertLessThanOrEqual(25, strlen($result));\n }\n\n public function testParseContactMobileWithCountryCode(): void\n {\n $service = $this->getServiceMock();\n $crmData = ['MobilePhone' => '07911123456'];\n\n $result = self::invokePrivateMethod('parseContactMobile', $service, ['GB', $crmData]);\n\n $this->assertNotNull($result);\n $this->assertStringStartsWith('+44', $result);\n }\n\n public function testImportOpportunitySkipsWhenProfileNotFound(): void\n {\n $crmData = [\n 'Id' => 'SF-NO-USER-2',\n 'Name' => 'Test Opportunity',\n 'OwnerId' => 'owner-not-found',\n // No AccountId - avoid complex account processing\n ];\n\n $client = $this->createMock(Client::class);\n $payloadBuilder = $this->createMock(PayloadBuilder::class);\n $eventDispatcher = $this->createMock(\\Illuminate\\Events\\Dispatcher::class); // ← ADD THIS\n $countriesMap = $this->createMock(CountriesMap::class);\n $prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);\n\n\n $service = new Service(\n $client,\n $payloadBuilder,\n $eventDispatcher,\n $countriesMap,\n $prospectPhotoPathService\n );\n\n $config = $this->createMock(Configuration::class);\n\n // Mock profiles relation returning null (no profile found)\n $profilesRelation = \\Mockery::mock(\\Illuminate\\Database\\Eloquent\\Relations\\HasMany::class);\n $profilesRelation->shouldReceive('where')->with('crm_provider_id', 'owner-not-found')->andReturnSelf();\n $profilesRelation->shouldReceive('first')->andReturn(null);\n\n $config->expects($this->once())\n ->method('profiles')\n ->willReturn($profilesRelation);\n\n $team = $this->createMock(Team::class);\n $team->method('getId')->willReturn(1);\n\n $logger = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $logger->expects($this->once())\n ->method('error')\n ->with(\n '[Salesforce] | Skip import, no user_id found',\n ['id' => 'SF-NO-USER-2']\n );\n\n $reflection = new \\ReflectionClass($service);\n\n $configProperty = $reflection->getProperty('config');\n $configProperty->setAccessible(true);\n $configProperty->setValue($service, $config);\n\n $teamProperty = $reflection->getProperty('team');\n $teamProperty->setAccessible(true);\n $teamProperty->setValue($service, $team);\n\n $loggerProperty = $reflection->getProperty('logger');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($service, $logger);\n\n // Initialize profile property\n $profileProperty = $reflection->getProperty('profile');\n $profileProperty->setAccessible(true);\n $profileProperty->setValue($service, null);\n\n $result = self::invokePrivateMethod('importOpportunity', $service, [$crmData]);\n\n $this->assertNull($result);\n }\n}\n\nclass HasManyExtended extends HasMany\n{\n public function where()\n {\n }\n\n public function first()\n {\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.41589096,"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.4245346,"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.43550533,"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.44414893,"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.45279256,"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.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":"Tx: Auto","depth":4,"bounds":{"left":0.47473404,"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.5013298,"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.51230055,"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.7237367,"top":0.09896249,"width":0.02825798,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"45","depth":4,"bounds":{"left":0.6938165,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.70611703,"top":0.123703115,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"41","depth":4,"bounds":{"left":0.71542555,"top":0.123703115,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"66","depth":4,"bounds":{"left":0.72706115,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7390292,"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}]...
|
3282220449727113155
|
-6520523286568608991
|
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
Rerun 'PHPUnit: ServiceTest'
Debug 'ServiceTest'
Stop 'ServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Built-in Preview
Chrome
Firefox
Safari
Sync Changes
Hide This Notification
Code changed:
Hide
3
32
81
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Salesforce;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Events\Dispatcher;
use Illuminate\Support\Facades\Cache;
use Jiminny\Component\Country\CountriesMap;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Enums\CrmObject;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\NoResultsException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Playbook;
use Jiminny\Models\Team;
use Jiminny\Models\TeamSettings;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\ContactRoleRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\Salesforce\Client;
use Jiminny\Services\Crm\Salesforce\PayloadBuilder;
use Jiminny\Services\Crm\Salesforce\QueryBuilder;
use Jiminny\Services\Crm\Salesforce\QueryHandler;
use Jiminny\Services\Crm\Salesforce\QueryIterator;
use Jiminny\Services\Crm\Salesforce\QueryResults;
use Jiminny\Services\Crm\Salesforce\Service;
use PHPUnit\Framework\MockObject\MockObject;
use Tests\TestCase;
use Tests\Unit\Traits\TestPrivateMethod;
class ServiceTest extends TestCase
{
use TestPrivateMethod;
public function testFetchAndAssociateRelatedActivity(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$payloadBuilder->method('addCustomLogicFieldsPayload')
->willReturnCallback(function ($activity, $payload) {
return $payload;
});
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook', 'getPlaybookCategory', 'updateRecord'])
->getMock();
$serviceMock->expects($this->once())
->method('fetchRelatedActivity')
->willReturn([
'Id' => 'testId',
'Type' => null,
'OwnerId' => 'testerUser',
'Description' => 'Test description',
]);
$user = $this->createMock(User::class);
$team = $this->createMock(Team::class);
$user->method('getAttribute')->with('team')->willReturn($team);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityField')->willReturn(null);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_EVENT);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('getPlaybookCategory');
$serviceMock->expects($this->never())
->method('updateRecord');
$fieldDataRepository = $this->createMock(FieldDataRepository::class);
$fieldDataRepository->method('getActivityFieldData')->willReturn(collect([]));
app()->instance(FieldDataRepository::class, $fieldDataRepository);
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$config->method('profiles')->willReturn($profilesRelation);
$serviceMock->config = $config;
$serviceMock->profile = null;
$actualStartTime = \Carbon\Carbon::now();
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['update', 'hasProspect'])
->getMock();
$activity->method('update')->willReturn(true);
$activity->method('hasProspect')->willReturn(true);
$activity->type = Activity::TYPE_CONFERENCE;
$activity->provider = Activity::PROVIDER_TWILIO;
$activity->lead_id = 1;
$activity->user_id = 0;
$activity->id_string = 'test-activity-id';
$activity->user = $user;
$activity->actual_start_time = $actualStartTime;
$activity->uuid = 'c53d8320-f556-4cee-a2f8-5f232f454ca4';
app()->bind(PlaybookResolver::class, function () use ($user) {
$playbook = $this->createMock(Playbook::class);
$playbookResolver = $this->createMock(PlaybookResolver::class);
$playbookResolver->expects($this->once())
->method('resolvePlaybookByUser')
->with($user)
->willReturn($playbook);
return $playbookResolver;
});
$data = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertInstanceOf(Activity::class, $data);
$this->assertEquals(Activity::TYPE_CONFERENCE, $data->getType());
$this->assertEquals($actualStartTime->getTimestamp(), $data->getActualStartTime()->getTimestamp());
}
public function testFetchAndAssociateRelatedActivitySkipsForTaskBasedPlaybook(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['fetchRelatedActivity', 'getPlaybook'])
->getMock();
$user = $this->createMock(User::class);
$playbook = $this->createMock(Playbook::class);
$playbook->method('getActivityType')->willReturn(Playbook::ACTIVITY_TYPE_TASK);
$playbook->method('getId')->willReturn(123);
$serviceMock->expects($this->once())
->method('getPlaybook')
->with($user)
->willReturn($playbook);
$serviceMock->expects($this->never())
->method('fetchRelatedActivity');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(true);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$activity->user = $user;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullForNonConference(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_SOFTPHONE;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoStartTime(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$serviceMock = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->getMock();
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = null;
$activity->scheduled_start_time = null;
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testFetchAndAssociateRelatedActivityReturnsNullWhenNoProspect(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['getPlaybook'])
->getMock();
$serviceMock->expects($this->never())
->method('getPlaybook');
$activity = $this->getMockBuilder(Activity::class)
->disableOriginalConstructor()
->onlyMethods(['hasProspect', 'getUuid'])
->getMock();
$activity->method('hasProspect')->willReturn(false);
$activity->method('getUuid')->willReturn('c53d8320-f556-4cee-a2f8-5f232f454ca4');
$activity->type = Activity::TYPE_CONFERENCE;
$activity->actual_start_time = \Carbon\Carbon::now();
$result = $serviceMock->fetchAndAssociateRelatedActivity($activity);
$this->assertNull($result);
}
public function testMatchExactlyByEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods([])
->getMock();
$profile = new Profile();
$profile->setAttribute('id', bin2hex(random_bytes(8)));
$serviceMock->profile = $profile;
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$data = $serviceMock->matchExactlyByEmail(bin2hex(random_bytes(8)) . '[EMAIL]');
$this->assertEquals(null, $data);
}
public function testMatchDomainFromEmail(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$queryIterator = $this->createMock(QueryIterator::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$config = $this->createMock(Configuration::class);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('search')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(['convertCrmData'])
->getMock();
$profile = new Profile();
$profile->account_fields = 'Field1, Field2, Field3';
$serviceMock->profile = $profile;
$serviceMock->expects($this->once())
->method('convertCrmData')
->willReturn(['test']);
$this->app->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildMatchByDomainQuery')
->with('[EMAIL]')
->willReturn('FIND {[EMAIL]} IN ALL FIELDS RETURNING Account(Id)');
return $queryBuilder;
});
$team = $this->createMock(Team::class);
$serviceMock->team = $team;
$serviceMock->config = $config;
$data = $serviceMock->matchByDomain('[EMAIL]');
$this->assertEquals(['test'], $data);
}
public function testBuildTaskSearchFields(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class)
);
$fields = $service->buildTaskSearchFields();
$expectedFields = ['Id', 'WhoId', 'WhatId', 'AccountId'];
$this->assertEquals($expectedFields, $fields);
}
public function testMapCrmObjects(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$service = new Service(
client: $client,
payloadBuilder: $payloadBuilder,
eventDispatcher: $eventDispatcher,
countriesMap: $countriesMap,
prospectPhotoPathService: $this->createMock(ProspectPhotoPathService::class),
);
$sampleTask = [
'WhoId' => '003sampleWhoId',
'AccountId' => 'sampleAccountId',
'WhatId' => 'sampleWhatId',
];
$activityData = $service->mapCrmObjects($sampleTask);
$expectedActivityData = [
'contact' => '003sampleWhoId',
'account' => 'sampleAccountId',
'opportunity' => 'sampleWhatId',
];
$this->assertEquals($expectedActivityData, $activityData);
}
public function testGetInstalledAppVersion(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
$queryIterator = $this->createMock(QueryIterator::class);
$queryIterator->expects($this->any())
->method('current')->willReturn([
'SubscriberPackageVersion' => [
'MajorVersion' => '1',
'MinorVersion' => '0',
'PatchVersion' => '1',
'BuildNumber' => '0',
],
]);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('metadata')
->willReturn($queryIterator);
return $handler;
});
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods(array_diff(get_class_methods(Service::class), ['getInstalledAppVersion']))
->getMock();
$version = $serviceMock->getInstalledAppVersion();
$this->assertEquals('1010', $version);
}
public function testSyncProfiles(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testSyncProfilesEmailIsNull(): void
{
$userToSearch = $this->createMock(User::class);
$salesforceUser = [
'Email' => null,
];
app()->bind(QueryBuilder::class, function () {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with(null)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->exactly(2))
->method('query')
->willReturn($queryIterator);
return $handler;
});
$team = $this->createMock(Team::class);
$user = $this->createMock(User::class);
$this->mockTeamRepository($team, $salesforceUser, $user, false);
$config = $this->createMock(Configuration::class);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles(null);
$this->assertNull($profile);
}
public function testSyncProfilesUserToSearchMatchesCurrentUser(): void
{
$userToSearch = $this->createMock(User::class);
$userToSearch->expects($this->once())
->method('getId')
->willReturn(123);
$team = $this->createMock(Team::class);
$config = $this->createMock(Configuration::class);
$config->expects($this->once())
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
];
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults([$salesforceUser], 1, true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->with('SELECT * FROM Users')
->willReturn($queryIterator);
return $handler;
});
$user = $this->createMock(User::class);
$user->expects($this->exactly(2))
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user);
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertInstanceOf(Profile::class, $profile);
}
public function testSyncProfilesWithCustomValidation(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$config->expects($this->atLeastOnce()) // Changed from once() to atLeastOnce()
->method('getId')
->willReturn(1);
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'CustomValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$user = $this->createMock(User::class);
$user->expects($this->once())
->method('getId')
->willReturn(123);
$this->mockTeamRepository($team, $salesforceUser, $user, true, $customRules);
$this->mockProfileRepository($user);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$profile = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($profile);
}
public function testSyncProfilesWithCustomValidationFailing(): void
{
$userToSearch = null;
$team = $this->createMock(Team::class);
$config = $this->createMockedConfiguration();
$salesforceUser = [
'Email' => '[EMAIL]',
'UserPreferencesLightningExperiencePreferred' => true,
'CallCenterId' => '123',
'Id' => '456',
'ProfileId' => '789',
'CustomField' => 'WrongValue',
];
$customRules = [
['field' => 'CustomField', 'value' => 'CustomValue'],
];
$this->mockQueryBuilderAndHandler($userToSearch, [$salesforceUser]);
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->never())
->method('updateOrCreateProfile');
$this->app->instance(ProfileRepository::class, $profileRepository);
$serviceMock = $this->getServiceMock();
$serviceMock->team = $team;
$serviceMock->config = $config;
$result = $serviceMock->syncProfiles($userToSearch);
$this->assertNull($result);
}
public function testGetContactRolesFromCrm(): void
{
$contactRoles = [
[
'Id' => '1',
'ContactId' => 'Contact1',
'OpportunityId' => 'Opportunity1',
'Opportunity' => ['OwnerId' => 'Owner1'],
'IsPrimary' => true,
'Role' => 'Decision Maker',
],
];
$expectedResponse = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
$this->bindQueryIterator($contactRoles);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals($expectedResponse, $data);
}
public function testGetContactRolesFromCrmNoResult(): void
{
$this->bindQueryIterator([]);
$serviceMock = $this->getServiceMock();
$data = $serviceMock->getContactRolesFromCrm(now()->subDay());
$this->assertEquals([], $data);
}
public function testSyncContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'contactId' => 'Contact1',
'opportunityId' => 'Opportunity1',
'ownerId' => 'Owner1',
'isPrimary' => true,
'role' => 'Decision Maker',
],
];
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('saveContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock([
'getContactRolesFromCrm',
'syncRemotelyDeletedContactRoles',
'syncContact',
'syncOpportunity',
]);
$config = $this->createMock(Configuration::class);
$hasMany = $this->createMock(HasManyExtended::class);
$hasMany->expects($this->exactly(2))
->method('where')
->willReturn($hasMany);
$hasMany->expects($this->exactly(2))
->method('first')
->willReturn(
$this->createMock(Contact::class),
$this->createMock(Opportunity::class)
);
$config->expects($this->once())
->method('contacts')
->willReturn($hasMany);
$config->expects($this->once())
->method('opportunities')
->willReturn($hasMany);
$serviceMock->config = $config;
$serviceMock->expects($this->once())
->method('getContactRolesFromCrm')
->willReturn($contactRoles);
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedContactRoles');
$data = $serviceMock->syncContactRoles(now()->subDay());
$this->assertEquals(1, $data);
}
public function testSyncRemotelyDeletedContactRoles(): void
{
$contactRoles = [
[
'id' => '1',
'crm_provider_id' => '1',
],
];
app()->bind(QueryHandler::class, function () use ($contactRoles) {
$queryResults = new QueryResults($contactRoles, 1, true, null);
$handler = $this->createMock(QueryHandler::class);
$handler->method('queryDeleted')
->willReturn($queryResults);
return $handler;
});
app()->bind(ContactRoleRepository::class, function () {
$contactRoleRepository = $this->createMock(ContactRoleRepository::class);
$contactRoleRepository->expects($this->once())
->method('deleteContactRoles');
return $contactRoleRepository;
});
$serviceMock = $this->getServiceMock();
$serviceMock->team = $this->createMock(Team::class);
$data = $this->invokePrivateMethod('syncRemotelyDeletedContactRoles', $serviceMock, []);
$this->assertTrue($data);
}
private function bindQueryIterator(array $queryResult): void
{
/** @var Client $client */
$client = $this->createMock(Client::class);
$queryIterator = new QueryIterator(
$client,
new QueryResults($queryResult, 1, true, null)
);
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
public static function getOpportunitySortOrderDataProvider(): array
{
return [
'all open recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_UPDATED, ['LastModifiedDate DESC', true]],
'all open recently created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_RECENTLY_CREATED, ['CreatedDate DESC', true]],
'all open oldest created' => [Configuration::OPP_ASSIGNMENT_ALL_OPEN_OLDEST_CREATED, ['CreatedDate ASC', true]],
'all recently updated' => [Configuration::OPP_ASSIGNMENT_ALL_RECENTLY_UPDATED, ['LastModifiedDate DESC', false]],
'default' => ['unknown', ['LastModifiedDate DESC', true]],
];
}
private function createMockedConfiguration(): Configuration
{
$config = $this->createMock(Configuration::class);
$profilesRelation = $this->getMockBuilder(\Illuminate\Database\Eloquent\Relations\HasMany::class)
->disableOriginalConstructor()
->onlyMethods(['get'])
->addMethods(['where', 'first'])
->getMock();
$profilesRelation->method('where')->willReturnSelf();
$profilesRelation->method('get')->willReturn(collect([]));
$profilesRelation->method('first')->willReturn(null);
$config->method('profiles')->willReturn($profilesRelation);
return $config;
}
private function getServiceMock(array $onlyMethods = []): MockObject&Service
{
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$this->createMock(Client::class),
$this->createMock(PayloadBuilder::class),
$this->createMock(Dispatcher::class),
$this->createMock(CountriesMap::class),
$this->createMock(ProspectPhotoPathService::class),
])
->onlyMethods($onlyMethods)
->getMock();
$serviceMock->profile = $this->createMock(Profile::class);
return $serviceMock;
}
private function mockQueryBuilderAndHandler($userToSearch, $salesforceUsers): void
{
app()->bind(QueryBuilder::class, function () use ($userToSearch) {
$queryBuilder = $this->createMock(QueryBuilder::class);
$queryBuilder->expects($this->once())
->method('buildGetUsersQuery')
->with($userToSearch)
->willReturn('SELECT * FROM Users');
return $queryBuilder;
});
$queryIterator = new QueryIterator($this->createMock(Client::class), new QueryResults($salesforceUsers, count($salesforceUsers), true, null));
app()->bind(QueryHandler::class, function () use ($queryIterator) {
$handler = $this->createMock(QueryHandler::class);
$handler->expects($this->any())
->method('query')
->willReturn($queryIterator);
return $handler;
});
}
private function mockTeamRepository(
Team $team,
array $salesforceUser,
?User $user = null,
bool $userSearch = true,
array $customRules = []
): void {
$teamRepository = $this->getMockForAbstractClass(TeamRepository::class, [], '', false, true, true, ['findActiveTeamMemberByEmail', 'getTeamSetting']);
if ($userSearch) {
$teamRepository->expects($this->once())
->method('findActiveTeamMemberByEmail')
->with($team, $salesforceUser['Email'])
->willReturn($user);
}
$teamSettings = $this->createMock(TeamSettings::class);
$teamSettings->method('getValueType')
->willReturn('array');
$teamSettings->method('getValue')
->willReturn(json_encode($customRules));
$teamRepository->expects($this->once())
->method('getTeamSetting')
->with($team, 'custom_profile_validation')
->willReturn($teamSettings);
app()->bind(TeamRepository::class, function () use ($teamRepository) {
return $teamRepository;
});
}
private function mockProfileRepository(User $user): void
{
$profileRepository = $this->createMock(ProfileRepository::class);
$profileRepository->expects($this->once())
->method('updateOrCreateProfile')
->with(
$user,
[
'crm_configuration_id' => 1,
'crm_provider_id' => '456',
],
[
'user_id' => 123,
'edition' => Profile::EDITION_LIGHTNING,
'has_external_cti' => true,
'crm_profile_id' => '789',
]
)
->willReturn(new Profile());
$this->app->instance(ProfileRepository::class, $profileRepository);
}
public function testBuildEnhancedNoteDecodesHtmlEntities(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-123');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnOnConsecutiveCalls('note-id-123', 'link-id-456');
$bodyWithEntities = 'Welch's current challenges and Facebook's Club';
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithEntities,
'object-id-789',
]);
$this->assertEquals('note-id-123', $result);
}
public function testBuildEnhancedNoteSanitizesWithoutQuotes(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-456');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<script>', $decoded);
return 'note-id-456';
}
return 'link-id-789';
});
$bodyWithMixedContent = "Welch's and <script>alert('xss')</script>";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithMixedContent,
'object-id-123',
]);
$this->assertEquals('note-id-456', $result);
}
public function testBuildEnhancedNoteConvertsLineBreaks(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-789');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringNotContainsString('<br />', $decoded);
return 'note-id-789';
}
return 'link-id-012';
});
$bodyWithLineBreaks = "Line 1\nLine 2\nLine 3";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Test Title',
$bodyWithLineBreaks,
'object-id-456',
]);
$this->assertEquals('note-id-789', $result);
}
public function testBuildEnhancedNoteHandlesComplexScenario(): void
{
$service = $this->getServiceMock(['createRecord']);
$profile = new Profile();
$profile->setAttribute('crm_provider_id', 'owner-complex');
$service->profile = $profile;
$service->expects($this->exactly(2))
->method('createRecord')
->willReturnCallback(function ($type, $data) {
if ($type === 'ContentNote') {
$decoded = base64_decode($data['Content']);
$this->assertStringContainsString("Welch's", $decoded);
$this->assertStringContainsString("Facebook's Club", $decoded);
$this->assertStringContainsString("Arctics'", $decoded);
$this->assertStringNotContainsString(''', $decoded);
$this->assertStringNotContainsString('&#039;', $decoded);
$this->assertStringContainsString('<br>', $decoded);
$this->assertStringContainsString('<', $decoded);
$this->assertStringContainsString('>', $decoded);
return 'note-complex';
}
return 'link-complex';
});
$complexBody = "Summary:\n---------\nThe call focused on understanding Welch's current challenges and exploring how Arctics' Revenue Growth Management solutions could support their strategic goals.\n\n• John SMith discussed his role as a category advisor for Google and Facebook's Club, emphasizing the importance of market research and advising on product assortment.\n• Madona introduced Arctics' Virtual Shoppers AI, which simulates consumer <behavior> to optimize pricing and promotional strategies.";
$result = $this->invokePrivateMethod('buildEnhancedNote', $service, [
'Jiminny Transcription Summary',
$complexBody,
'task-id-001',
]);
$this->assertEquals('note-complex', $result);
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingSuccess(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-123');
$serviceMock->team = $team;
// Expect syncRemotelyDeletedObjects to be called once and succeed
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::ACCOUNT);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not throw any exceptions
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::ACCOUNT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingFailure(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-456');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$reflection = new \ReflectionClass($serviceMock);
$loggerProperty = $reflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Sync failed due to API error');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::CONTACT)
->willThrowException($exception);
// Expect warning to be logged with correct message and parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'contact',
'teamId' => 'team-uuid-456',
'reason' => 'Sync failed due to API error',
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
$method->setAccessible(true);
// Should not re-throw the exception, just log it
$method->invoke($serviceMock, \Jiminny\Enums\CrmObject::CONTACT);
$this->assertTrue(true); // Test completed successfully
}
public function testSyncRemotelyDeletedObjectsWithErrorHandlingWithLogParams(): void
{
$client = $this->createMock(Client::class);
$payloadBuilder = $this->createMock(PayloadBuilder::class);
$countriesMap = $this->createMock(CountriesMap::class);
$prospectPhotoPathService = $this->createMock(ProspectPhotoPathService::class);
$eventDispatcher = $this->createMock(Dispatcher::class);
/** @var Service&MockObject $serviceMock */
$serviceMock = $this->getMockBuilder(Service::class)
->setConstructorArgs([
$client,
$payloadBuilder,
$eventDispatcher,
$countriesMap,
$prospectPhotoPathService,
])
->onlyMethods(['syncRemotelyDeletedObjects'])
->getMock();
// Mock team
$team = $this->createMock(Team::class);
$team->method('getUuid')->willReturn('team-uuid-789');
$serviceMock->team = $team;
// Mock logger to verify warning is logged
$logger = $this->createMock(\Psr\Log\LoggerInterface::class);
// Use reflection to set the protected logger property
$loggerReflection = new \ReflectionClass($serviceMock);
$loggerProperty = $loggerReflection->getProperty('logger');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($serviceMock, $logger);
$exception = new \Exception('Network timeout');
// Expect syncRemotelyDeletedObjects to throw an exception
$serviceMock->expects($this->once())
->method('syncRemotelyDeletedObjects')
->with(\Jiminny\Enums\CrmObject::OPPORTUNITY)
->willThrowException($exception);
// Additional log parameters
$logParams = [
'syncType' => 'full',
'batchSize' => 100,
];
// Expect warning to be logged with merged parameters
$logger->expects($this->once())
->method('warning')
->with(
'[Salesforce] Remotely deleted objects sync failed',
[
'objectType' => 'opportunity',
'teamId' => 'team-uuid-789',
'reason' => 'Network timeout',
'syncType' => 'full',
'batchSize' => 100,
]
);
// Call the protected method using reflection
$reflection = new \ReflectionClass($serviceMock);
$method = $reflection->getMethod('syncRemotelyDeletedObjectsWithErrorHandling');
...
|
85733
|
NULL
|
NULL
|
NULL
|
|
85734
|
2938
|
6
|
2026-05-28T13:03:59.948949+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973439948_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8043719072324535154
|
-8628527368849355612
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
iTerm2• • 0ShellEditVie Project: faVsco.js, menu
iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976+++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85100% <78• Thu 28 May 16:03:59L881ec2-user@ip-10-30-129-...ec2-user@ip-10-30-140-...₴7...
|
85732
|
NULL
|
NULL
|
NULL
|
|
85732
|
2938
|
5
|
2026-05-28T13:03:58.349211+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973438349_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78 • Thu 28 May 16:03:581₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
7922818983694723678
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78 • Thu 28 May 16:03:581₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85733
|
2939
|
6
|
2026-05-28T13:03:58.245665+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973438245_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomViewCoocFV faVsco.|s ~#12121 on JY-20963-fx rapstomViewCoocFV faVsco.|s ~#12121 on JY-20963-fx-proidet• HttpIntegrationslinteractionsJobsa MailModelsanoureatonsvoseivers(C SocialAccountObserverTest.gUserObserverTest.phpUserRoleObserverTest.phoPolcies>EACtVIYDa ActivityProviderslealendanTeonterenco•Rullmeen& CloseleooneMi HibsootD IntegrationApplllistenarsPipedrive(D Salesforce• (b Field:D OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.oC DeleteObiectsTrait TestFieldDefinitionsTest.oh© GetActivitvFieldNameTPavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohC Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest ohoWindowwnapers.ohyTeom.one©ActivityControlier.phpA SF fiminny@localhost)A console (STAGING)De00 Tx.AutovBY u.id, v.enail, u.name, u.softphone_number* fron teans where id = 1;# console fiaum045 A1 A41 У 66 4class servicerest excends testcasepublic function testFetchAndAssociateRelatedActivityO: voidSatient & Sthis->createlockld onenetientchssSoav loadBusi den & SthisoscrenteVockld cno neteiosePayloadBust den. sclass)SoavloadBusi dens>nethodid constn->willReturnCallback(function (Sactivity, Spayload) (...*)Scountniestan=SthiiscscreateVockltono/** @var Service&MockObnect SserviceMock */SserviceMock = Sthis->getMockBuilder className: Service::class)->setConstructorArgs(CalkontSoayLoadbuzloersevencurspaccherScountriesMapSthis->createMock( originalClass>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo>mhodl"fetchRelatedActävity")-sweeerumnia"descriintsion' "Test descriattion"Steam = Sthis->createMock( orig"aetattoibute"oythltearoum"tean"oyil Return SteamplavhonkecllaseSnlavhookoSnethodlTon.ofedtradend v Accept Fle x- 5 X-Papaи fнo p3elnninhilsSplaybook->method( constraint: "getActivityType')->willReturn( value: Playbook::ACTIVITY TYPE EVENT)710711=712713fron text relays where created at > 2926-05-91.fron actsivitsles where user_id TN (7169, 18688) and created at > 2926-85-22* orden by id desci* fron users where team_id = 1 and id IN (18688, 13934, 7160);* fron activities where user_id = 7160 order by id desc Linit 10;*foon teane where ¿d = 1117:foon setkusty coanch filitane nhans actfusty canoch SA TM CARRR) RRO92TO0У L7Thu 28 May 16:03:57eeendhles orchwerwicee+0.testsruexec dovkers/crm/3 bestore 5e/vicer/stmphpy - iterwenest/brseContact' 2561PHPUnit 11.5.55 by Sebastian Bergmann and contributors.conteouratciont no.e/tminayohounsx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha mll SarufcaTast to contmm nothico ie bzokna.• decter exe sdrcker /era/3 bestore Servioeeeitetnay 55 php a5vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Confiquration:/home/siminny/phpunit.xmD.-DODOD..•••0000.DD.......••. 65 / 73 ( 894TIeA: 60:21 704 MamArиs 04160 MpA.7s tests pass. Herc's a summary of what was added.oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7newssanrsctontact phos•testParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?+eParsccontad Pnonewnextens ton -Tmoer wihler dcontoty ertactne exentotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobile•testParsetontac Nonathaidduher- E6 numaertetumed netActPsreAtontsctwahsntehrunestMhT/20Ghhre-Mimawtlwawthan2f.thare aote thinastodltroledtACtOsrcAGont.CMAKSlWWAthGAuAtruCAA.-TAAITIKmAwAroALAhtArmcimaAMlintrv.oh1tile +80 2Accept allAsk anything (XOL)" PodnAdhotvwodturlhhmeewhi.es*4 space...
|
NULL
|
-2503543311014622480
|
NULL
|
click
|
ocr
|
NULL
|
rapstomViewCoocFV faVsco.|s ~#12121 on JY-20963-fx rapstomViewCoocFV faVsco.|s ~#12121 on JY-20963-fx-proidet• HttpIntegrationslinteractionsJobsa MailModelsanoureatonsvoseivers(C SocialAccountObserverTest.gUserObserverTest.phpUserRoleObserverTest.phoPolcies>EACtVIYDa ActivityProviderslealendanTeonterenco•Rullmeen& CloseleooneMi HibsootD IntegrationApplllistenarsPipedrive(D Salesforce• (b Field:D OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.oC DeleteObiectsTrait TestFieldDefinitionsTest.oh© GetActivitvFieldNameTPavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohC Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest ohoWindowwnapers.ohyTeom.one©ActivityControlier.phpA SF fiminny@localhost)A console (STAGING)De00 Tx.AutovBY u.id, v.enail, u.name, u.softphone_number* fron teans where id = 1;# console fiaum045 A1 A41 У 66 4class servicerest excends testcasepublic function testFetchAndAssociateRelatedActivityO: voidSatient & Sthis->createlockld onenetientchssSoav loadBusi den & SthisoscrenteVockld cno neteiosePayloadBust den. sclass)SoavloadBusi dens>nethodid constn->willReturnCallback(function (Sactivity, Spayload) (...*)Scountniestan=SthiiscscreateVockltono/** @var Service&MockObnect SserviceMock */SserviceMock = Sthis->getMockBuilder className: Service::class)->setConstructorArgs(CalkontSoayLoadbuzloersevencurspaccherScountriesMapSthis->createMock( originalClass>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo>mhodl"fetchRelatedActävity")-sweeerumnia"descriintsion' "Test descriattion"Steam = Sthis->createMock( orig"aetattoibute"oythltearoum"tean"oyil Return SteamplavhonkecllaseSnlavhookoSnethodlTon.ofedtradend v Accept Fle x- 5 X-Papaи fнo p3elnninhilsSplaybook->method( constraint: "getActivityType')->willReturn( value: Playbook::ACTIVITY TYPE EVENT)710711=712713fron text relays where created at > 2926-05-91.fron actsivitsles where user_id TN (7169, 18688) and created at > 2926-85-22* orden by id desci* fron users where team_id = 1 and id IN (18688, 13934, 7160);* fron activities where user_id = 7160 order by id desc Linit 10;*foon teane where ¿d = 1117:foon setkusty coanch filitane nhans actfusty canoch SA TM CARRR) RRO92TO0У L7Thu 28 May 16:03:57eeendhles orchwerwicee+0.testsruexec dovkers/crm/3 bestore 5e/vicer/stmphpy - iterwenest/brseContact' 2561PHPUnit 11.5.55 by Sebastian Bergmann and contributors.conteouratciont no.e/tminayohounsx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MBAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha mll SarufcaTast to contmm nothico ie bzokna.• decter exe sdrcker /era/3 bestore Servioeeeitetnay 55 php a5vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Confiquration:/home/siminny/phpunit.xmD.-DODOD..•••0000.DD.......••. 65 / 73 ( 894TIeA: 60:21 704 MamArиs 04160 MpA.7s tests pass. Herc's a summary of what was added.oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7newssanrsctontact phos•testParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?+eParsccontad Pnonewnextens ton -Tmoer wihler dcontoty ertactne exentotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobile•testParsetontac Nonathaidduher- E6 numaertetumed netActPsreAtontsctwahsntehrunestMhT/20Ghhre-Mimawtlwawthan2f.thare aote thinastodltroledtACtOsrcAGont.CMAKSlWWAthGAuAtruCAA.-TAAITIKmAwAroALAhtArmcimaAMlintrv.oh1tile +80 2Accept allAsk anything (XOL)" PodnAdhotvwodturlhhmeewhi.es*4 space...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85731
|
2938
|
4
|
2026-05-28T13:03:45.735865+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973425735_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
TextRelayServiceTest...
|
[{"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","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":"TextRelayServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5714658179048184897
|
-8634297297851446848
|
idle
|
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
TextRelayServiceTest
iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER-₴81DEV (docker)₴82-zshN3screenpipe"O &4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85100% <78• Thu 28 May 16:03:45L881ec2-user@ip-10-30-129-...ec2-user@ip-10-30-140-...₴7...
|
85729
|
NULL
|
NULL
|
NULL
|
|
85730
|
2939
|
5
|
2026-05-28T13:03:44.368156+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973424368_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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...
|
[{"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","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.8374335,"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}]...
|
8569994499127135030
|
-3986301007428073024
|
idle
|
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
rapstomViewCoocFV faVsco.|s ~#12121 on JY-20963-fx-• HttpIntegrationslinteractionsJobsa MailModelsanoureatonsvoseivers(C SocialAccountObserverTest.rUserObserverTest.phpUserRoleObserverTest.phoPolcies>EACtVIYla ActivityProvider:lealendanTeonterenco•RullmeencloseleooneMi HibsootlllistenarsPipedrive(D Salesforce• (b Field:D OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.oC DeleteObiectsTrait TestAGNAnafniioast eston© GetActivitvFieldNameTPavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohC Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest oho38 %9Windowwnapers.ohyTeom.one©ActivityControlier.phpuCicheoneA SF fiminny@localhost)console (PROD) XA console (STAGING)De000T Autowreated at > DATE SUB(NOWO), INTERVAL 38 DAYBY u.id, u.email,u.name u.sotcphone nunbenBY sns_count DESC;7827es* fron teans where id = 1;710711=712713NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner) ' ELSE "* END) AS user_id,# console fiaum045 A1 A41 У 66 4Curssirvcaloslexcondsesstpublic function testFetchAndAssociateRelatedActivityO: voidSatient & Sthis->createlockld onenetientchssSoav loadBusi den & SthisoscrenteVockld cno neteiosePayloadBust den. sclassh.SoavloadBusi dens>nethodid constn->willReturnCallback(function (Sactivity, Spayload) (...*)Scountcestann SthisoscreateVockltonol/** @var Service&MockObnect SserviceMock */SserviceMock = Sthis->getMockBuilder className: Service::class)->setConstructorArgs(CalkontSoayLoadbuzloersevencurspaccherScountriesMapSthis->createMock( originalClassh>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo->mnadl ciTerchie fred.cewiy'-sweeerumnia"descriintsion' "Test descriattion"Steam = Sthis->createMock( originTean::class):"aetattoibute"oythltearoum"tean"oyil Return Steamplavhankes cllasshSnlavhonkesnethodlTon.offedtradend v Accept Fle x- 5 X-Papaи fнo p3elninhilsSplaybook->method( constraint: "getActivityType')->willReturn( value: Playbook::ACTIVITY TYPE EVENT) =acrvimes a oN to.aciaviry1d = a.10vider1d = 'hs actavitytypel* FROM activity_messages:fron text rellavs where created.ar > 7826-85-8* fron actsivities where user id TN (7168, 18688) and created at > *2826-85-22' order by sid descl* fron users where team id = 1 and id TN (18688, 13934. 7169)=* fron activities where user_id = 7160 order by id desc Linit 10;* fron accounts where team_id = 1 and nane = 'Columns" :*Thor tasne whendr14* fron actávity_searches where user_id = 31854;*Eoon sctkusty coanch Eilitane nhans actkusty cancch fa TM CRRRR2 RRO02TO0У L7Thu 28 May 16:03:44eeendhlesorceserwicee+0.testsruexec dovkers/crm/3 bestore 5e/vicer/stmphpy - iterwenest/brseContact' 2561PHPUnit 11.5.55 by Sebastian Bergmann and contributors.contelouratciontnore/tinnyl ohounx"11/ 11 (100%Tine: 00:10.908, Memory: 66.00 MEAl 11 new and existing testParseContact* tests pass. The deprecations are pre-existing PHPUnit warningsLet ma aiso ar'cklv nin tha mll SarufcaTast to contmm nothico ie bzokna.• decter exe sdrcker /era/3 bestore Servioeeeitetnay 55 php a5vendor/bin/phpun:PHPUnzt 11.5.55 by Sebastzan Beramann and contributors.Confiquration:/home/siminny/phpunit.xmD.•DODOD..•••D000.DD.......••• 65 / 73 ( 894TIeA: 80.2 70 MARAPus OA 1a0 MpA.7s tests pass. Herc's a summary of what was added:oo eoesThe PR already covered empty/null early-return paths. The missing coverage was for the happy paths - added 7newssanrsctontact phos•testParseContactPhoneWithValidNumber - E.164 number parses correctly, ext is nul?+eParsccontad Pnonewnextens ton -Tmoer wihler dcontoty ertactne exentotactpareacontsctPhonaFyttetruncatettotochare=sytwttolonosthm.th/chhre.abtetnindstodllGtru1taetbareacontnetPhondthrount.rtodesloclkoim.tthto.totowmeine.cotntrv.conparseContactMobile•testParsetontac Nonathaidduher- E6 numaertetumed netActPsreAtontsctwahsntehrunestMhT/20Ghhre-Mimawtlwawthan2f.thare aote thinastodltroledtACtOsrcAGont.CMAKSlWWAthGAuAtruCAA.-TAAITIKmAwAroALAhtArmcimaAMlintrv.oh1tile +80 2Accept allAsk anything (XoL)" PodnAdhotvwodturlhhmeewhi.es*4 space...
|
85728
|
NULL
|
NULL
|
NULL
|
|
85729
|
2938
|
3
|
2026-05-28T13:03:12.948247+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973392948_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8043719072324535154
|
-8628527368849355612
|
idle
|
hybrid
|
NULL
|
Project: faVsco.js, menu
iTerm2• • 0ShellEditVie Project: faVsco.js, menu
iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER-₴81DEV (docker)₴82-zshN3ffmpegO ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++*app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:03:121₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85728
|
2939
|
4
|
2026-05-28T13:03:11.614822+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973391614_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.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}]...
|
8043719072324535154
|
-8628527368849355612
|
idle
|
hybrid
|
NULL
|
Project: faVsco.js, menu
rapstomViewCoocWindowFV f Project: faVsco.js, menu
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-• HttpIntegrationslinteractionsE Jobsa MailModelsanoureatonsvoseivers(C SocialAccountObserverTest.gUserObserverTest.phpUserRoleObserverTest.phoPolcies>EACtVIYDa ActivityProviderslealendanTeonterenco•RullmeencloseleooneMi HibsootlllistenarsPipedrive(D Salesforce• (b Field:D OpportunityMatcherOpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.oC DeleteObiectsTrait Testananafaiioostestoh© GetActivitvFieldNameTPavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohC Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest ohownapers.ohyTeom.one38 %9©ActivityControlier.phpuCicheoneTO0У L7inu co moy to.us.+0.A SF fiminny@localhost)console (PROD) XA console (STAGING)De000T Autowreated at > DATE SUB(NOWO), INTERVAL 38 DAYBY u.id, u.email,u.name u.sotcphone nunbenBY sns_count DESC;7827es* fron teans where id = 1;710711=712713NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner) ' ELSE "* END) AS user_id,Curssirvcaloslexcondsesstpublic function testFetchAndAssociateRelatedActivityO: voidSatient & Sthis->createlockld onenettenteclass)sSoav loadBusi den & SthisoscrenteVockld cno neteiosePayloadBust den. sclassh.SoavloadBusi dens>nethodid constn->willReturnCallback(function (Sactivity, Spayload) (...*)ScountriesMap = Sthis->createMock origl/** @var Service&MockObnect SserviceMock */SserviceMock = Sthis->getMockBuilder className: Service::class)->setConstructorArgs(CalkontSoayLoadbuzloersevencurspaccherScountriesMapSthis->createMock( originalClassh>oncynechodstecchketacecacc.v.cy→>аскносkонwcthoekoseyocerReiaho>oneo>mhodlTerchie fred.cewiy'-sweeerumnia"descriintsion' "Test descriattion"Steam = Sthis->createMock( originTean::class):"aetattoibute"oythltearoum"tean"oyil Return SteamplavhonkecllaseSnlavhonkesnethodlTon.offedtradend v Accept Fle x- 5 X-Papaи fнo p3elnninhilsSplaybook->method( constraint: "getActivityType')->willReturn( value: Playbook::ACTIVITY TYPE EVENT) =acrviies a UN to.acovity 1d = a.10vider1d = 'hs actavity tyoen* FROM activity_messages:fron text rellavs where created.ar > 7826-85-8* fron actsivities where user id TN (7168, 18688) and created at > *2826-85-22' order by sid descl* fron users where team id = 1 and id TN (18688, 13934. 7169)=* fron activities where user_id = 7160 order by id desc Linit 10;* fron accounts where team_id = 1 and nane = 'Columns":*Toon tasne whendae* fron actávity_searches where user_id = 31854;*Eoon sctkusty coanch Eilitane nhans actkusty cancch fa TM CRRRR2 RRO02# console fiaumCascadillesorcesarici045 A1 A41 У 66 4SanEelton etnctParcaContncta 256could not ooen snout ote: var wwlntevarttsantester exedrcker/crm/5 lestore Sevicetest.ptp -f ite artestParseContact' 2261couid nor doen sinmt retarsa• docker ps =format "(.Names)}' 2261 || head -20docker-sorsadb-1° docker exec docker_lamp_1 bash -C "find / -nane "artisan' -saxdepth 6 2>/dev/null | heahosa/henoulartendeske/unteC serckers/cre/3 testore vServicerest. Prpy Ptere nesr/arsecontact: 2-61-PHPUnit 11.5.55 by Sebastian Bergmann and contributors.11 / 11 (100%Tise: 08:10.998. Menory: 66.00 MEAl 11 new and existing testParseContacte tests pass. The deprecations are pre-existing PHPUnit warningsunelatooucnandeset ma siea ai ntlv nin tho tuli Carus taTaet to ran tmm nathinh te maieio decker exec sdocker lamp 3 bash -e Sertoee/stainny 56 php vend020vendor/bin/phpuni1tile +80 2Accept allAsk anything (XOL)" PodnAdhotv• Owodturlhhmeewhi.est4 spad...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85727
|
2938
|
2
|
2026-05-28T13:02:39.348567+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973359348_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER₴81DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:02:381₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
4587511657139576741
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER₴81DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:02:381₴1ec2-user@ip-10-30-140-...₴7...
|
85724
|
NULL
|
NULL
|
NULL
|
|
85726
|
2939
|
3
|
2026-05-28T13:02:36.662551+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973356662_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20 rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-lnhe heloers phialermninete th oe©ActivityControlier.php8 HtteIntegrationsnlinteractionsuewholeooserver.onyTeom.oneuCicheonea Jobsauisteneisa MailModelsanoureadonsvosewvers(C SocialAccountObserverTest.rUserObserverTest.phpUserRoleObserverTest.phoPolciesa ProviderE Ruc.>EACtVIYDa ActivityProviderslealendan•Tenterencoa erm→RulihorcloseleooneTmermob actsHelpersHubspotD IntegrationAppTn l istenars1114VNu PioconiveMSalestorce1182 dIMEeOSD OpportunityMatcher1228 €l OpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.oho1366CwsamtosdweC DeleteObiectsTrait Testaanhtntoasieron© GetActivitvFieldNameTPavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohe1592 6C Semceltestoo@*SuncRatchRedicSenics@ RaseSeniiceTest ohoprivate function createMockedConfiguration: Configuration(...;Z0 090005private function getServiceMock(array SonlyMethods = (): MockObject&Service(...-private function mockQueryBuilderAndHandler(SuserToSearch, SsalesforceUsers): voidk...-Tuser suser = nultarray Scustonkules =): void {..11 usageprivate function nockProfileRepository(User Suser): voidt...)public function testBuildEnhancedNoteDecodesHtmlEntztzes: voidt...=public function testBuildEnhancedNoteSanitizeslithoutQuotes(): voidf...}public function testBuildEnhancedNoteConvertsLineBreaksO: voidt...public function testBuildEnhancedNoteHandLesCompLexScenario: voidt...:public function testSyncRenotelyDeleted0bfectsllithErrorHandLingSuccess(): voidf...}public function testSyncRemotelyDeleted0biectsllithErrorHandLingFailure): voidi...}public function testSyncRemotelyDeleted0biectsltithErrorHandLingWithLogParans: voidf...}* AdataProvider cra0biectProvidenpublic functaion testSyncRenotelv0eleted0biectshithErrorHandTing0ifferentCon0biects@.Jiminny\Enums\Co101oublic funetsion testHandle0btectDeletionltithDeletedEntitvO= voidh.public functaion testHandle0bdectDeletzioniithMonDeletedEntatyOe voidi...}oublie funetzion testDeleteCon0bdectuithValidentty@e vosdf...%public function testDeretecrnübjectiis v Accept Fle x-3XORENet-Fie OX@TO0У L7Thu 28 May 16:02:36+0.A SF fiminny@localhost)console (PROD) XA console [STAGING)100 €Ty: Autow78178210%=7715716ДНШНО ПИПВН-НННВНОНОПЛИВНИЕ ИНВ В-712)=INTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;" tron roleshNCAT(u.id, CASE WHEN u.id = t.ouner_id THEN • (ouner)* ELSE ** END) AS user_idouner_id FROM social_accounts saeans t 1n<->1:on t.id= u.tean jdU.tean_id = 1117 and sa.provider = "hubspot":*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59*EROM ActM tes WHEOF muhd to binl:255208/3-800/-1781-0276.66648288185c01= musde 80186192 M0* FROM crn_configurations WHERE id = 1853)* Eoon uicene whena 3d = 30240* Eoon nlavbonke whane 1d = 5/775* fron playbook categonies where id = 43783:* fron playbook_categories nhere playbook_id = 5473;*Eoon enn ffalde whons 4d = 450242.*foon en £4old valuae whans con £iald 4d = 450242.* FROM Crn_field_dato fdAAE RAA GOM EH AN CANWRACEEacrviies a UN to.acovity 1d = a.10crnprowiderd= hs actvity type"* FROM activity_messages:where created at > *2826-05-91*•* fron actsivities where user_id TN (7168, 18688) and created at > '2826-85-22' order by sid descausers where team id = 1 and id TN (18688, 13934. 7169):*£ron activities where usen 1a = 7169 order bu ja desc 1ini+ 18:* Aron accounts whene taar oe and nane wallease*£oon usens whene name 13ke IXSubrakt. n 31954 1112Toon tasne whanda4*foon Antéusty seanches whene usen $a = 71852.*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2).# console fiaum045 A1 A41 У 66 4Cascaollestorcesaricet:wwrccontac.thone withatenl onone.nomootnotau.thowihaoonenomochatnaanextcnsonwrttontc wobe within renl mooie numoer. with trinetohltyt charsNow let me verity the tests run. First let me find the right test runner commanddests/unxe/ erciees/crm/Sa lestorce/ServiceTesttison -fiitere"testParseContact" 2>61coullo no ooensinoeeewrwwneiret• docker exec docker lamp 1 bash -c "cd /var/ww/html 66 php artisan testtests/Unit/Services/Crm/Salesforce/ServiceTest.php =f1lter='testParseContact' 2>&1"could not ooen snout ote: artisa• docker ps -format "{{.Names)}' 2>61 | head -20elasticsearchdocker-marindb-1• docker exec docker_lamp_1 bash -C "find / -nane "artisan' -saxdepth 6 2>/dev/null | heahore/imsinny/artatsaresker exe serckers/cra73 bestore eServicee te phpy -f te re resr/arsecontact' 2-61°PHPUnit 11.5.55 by Sebastian Bergmann and contributors.OUD 9 CCconsourctontno.ebttnay/ohounx1/1111004Tiee: 00:10.908, Menory: 66.00 MEAl 11 now and exicting testparsctontacte toate onke. tihe doorcantions aae or1tile +80 2Accept allAsk anything (XOL)" PodeAdhotvwodturlhhmeewhi.est4 spad...
|
NULL
|
169212733282570035
|
NULL
|
visual_change
|
ocr
|
NULL
|
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20 rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-lnhe heloers phialermninete th oe©ActivityControlier.php8 HtteIntegrationsnlinteractionsuewholeooserver.onyTeom.oneuCicheonea Jobsauisteneisa MailModelsanoureadonsvosewvers(C SocialAccountObserverTest.rUserObserverTest.phpUserRoleObserverTest.phoPolciesa ProviderE Ruc.>EACtVIYDa ActivityProviderslealendan•Tenterencoa erm→RulihorcloseleooneTmermob actsHelpersHubspotD IntegrationAppTn l istenars1114VNu PioconiveMSalestorce1182 dIMEeOSD OpportunityMatcher1228 €l OpportunitySyncStratel ProsoectSearchStratecim sancettaisClientTest.oho1366CwsamtosdweC DeleteObiectsTrait Testaanhtntoasieron© GetActivitvFieldNameTPavloadBuilder [EMAIL]© QuervHandlerTest.oha©QuerviteratorTest.ohr©QuervResuitsTests.ohe1592 6C Semceltestoo@*SuncRatchRedicSenics@ RaseSeniiceTest ohoprivate function createMockedConfiguration: Configuration(...;Z0 090005private function getServiceMock(array SonlyMethods = (): MockObject&Service(...-private function mockQueryBuilderAndHandler(SuserToSearch, SsalesforceUsers): voidk...-Tuser suser = nultarray Scustonkules =): void {..11 usageprivate function nockProfileRepository(User Suser): voidt...)public function testBuildEnhancedNoteDecodesHtmlEntztzes: voidt...=public function testBuildEnhancedNoteSanitizeslithoutQuotes(): voidf...}public function testBuildEnhancedNoteConvertsLineBreaksO: voidt...public function testBuildEnhancedNoteHandLesCompLexScenario: voidt...:public function testSyncRenotelyDeleted0bfectsllithErrorHandLingSuccess(): voidf...}public function testSyncRemotelyDeleted0biectsllithErrorHandLingFailure): voidi...}public function testSyncRemotelyDeleted0biectsltithErrorHandLingWithLogParans: voidf...}* AdataProvider cra0biectProvidenpublic functaion testSyncRenotelv0eleted0biectshithErrorHandTing0ifferentCon0biects@.Jiminny\Enums\Co101oublic funetsion testHandle0btectDeletionltithDeletedEntitvO= voidh.public functaion testHandle0bdectDeletzioniithMonDeletedEntatyOe voidi...}oublie funetzion testDeleteCon0bdectuithValidentty@e vosdf...%public function testDeretecrnübjectiis v Accept Fle x-3XORENet-Fie OX@TO0У L7Thu 28 May 16:02:36+0.A SF fiminny@localhost)console (PROD) XA console [STAGING)100 €Ty: Autow78178210%=7715716ДНШНО ПИПВН-НННВНОНОПЛИВНИЕ ИНВ В-712)=INTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;" tron roleshNCAT(u.id, CASE WHEN u.id = t.ouner_id THEN • (ouner)* ELSE ** END) AS user_idouner_id FROM social_accounts saeans t 1n<->1:on t.id= u.tean jdU.tean_id = 1117 and sa.provider = "hubspot":*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59*EROM ActM tes WHEOF muhd to binl:255208/3-800/-1781-0276.66648288185c01= musde 80186192 M0* FROM crn_configurations WHERE id = 1853)* Eoon uicene whena 3d = 30240* Eoon nlavbonke whane 1d = 5/775* fron playbook categonies where id = 43783:* fron playbook_categories nhere playbook_id = 5473;*Eoon enn ffalde whons 4d = 450242.*foon en £4old valuae whans con £iald 4d = 450242.* FROM Crn_field_dato fdAAE RAA GOM EH AN CANWRACEEacrviies a UN to.acovity 1d = a.10crnprowiderd= hs actvity type"* FROM activity_messages:where created at > *2826-05-91*•* fron actsivities where user_id TN (7168, 18688) and created at > '2826-85-22' order by sid descausers where team id = 1 and id TN (18688, 13934. 7169):*£ron activities where usen 1a = 7169 order bu ja desc 1ini+ 18:* Aron accounts whene taar oe and nane wallease*£oon usens whene name 13ke IXSubrakt. n 31954 1112Toon tasne whanda4*foon Antéusty seanches whene usen $a = 71852.*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2).# console fiaum045 A1 A41 У 66 4Cascaollestorcesaricet:wwrccontac.thone withatenl onone.nomootnotau.thowihaoonenomochatnaanextcnsonwrttontc wobe within renl mooie numoer. with trinetohltyt charsNow let me verity the tests run. First let me find the right test runner commanddests/unxe/ erciees/crm/Sa lestorce/ServiceTesttison -fiitere"testParseContact" 2>61coullo no ooensinoeeewrwwneiret• docker exec docker lamp 1 bash -c "cd /var/ww/html 66 php artisan testtests/Unit/Services/Crm/Salesforce/ServiceTest.php =f1lter='testParseContact' 2>&1"could not ooen snout ote: artisa• docker ps -format "{{.Names)}' 2>61 | head -20elasticsearchdocker-marindb-1• docker exec docker_lamp_1 bash -C "find / -nane "artisan' -saxdepth 6 2>/dev/null | heahore/imsinny/artatsaresker exe serckers/cra73 bestore eServicee te phpy -f te re resr/arsecontact' 2-61°PHPUnit 11.5.55 by Sebastian Bergmann and contributors.OUD 9 CCconsourctontno.ebttnay/ohounx1/1111004Tiee: 00:10.908, Menory: 66.00 MEAl 11 now and exicting testparsctontacte toate onke. tihe doorcantions aae or1tile +80 2Accept allAsk anything (XOL)" PodeAdhotvwodturlhhmeewhi.est4 spad...
|
85725
|
NULL
|
NULL
|
NULL
|
|
85725
|
2939
|
2
|
2026-05-28T13:02:31.332664+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973351332_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20 rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-proideta cayicepnnhe heloers phitnelereobiecistraicon:©ActivityControlier.php• HttpIntegrationslinteractionsuewholeooserver.ono Teanupc) e enupn;E Jobsclass ServiceTest extends TestCasea MailModelsNotifications24922493 K24942495public function testResolveContactCountryCode(array ScrnData,?bool ScountryExistsvoseivers@ SocialAccountObserverTest, 2497UserObserverTest.php2470AEZAUserRoleObserverTest.phoasuans sconvercedcoderocrans sexoected: void ..Polcies1Usdotpublic static function parseContactPhoneProvider@: array..254425452540*soratnov der parseconcac.Phonerrovzden>EACtVIYDa ActivityProviders2548 ₽public function testParseContactPhoneWithEmotyPhone(array Scrabata, Pstring ScountryCode, array Sexo6a 7145SSlealendanpubazc tuncicion testParsetoncac Phoncazchva-zohunber: vozdTeonterenco7557a erm•Rullmeen& CloseleooneTi HelnersHubspotD IntegrationApplllistenars256425652566u Pioconive(D Salesforce2567 D• (b Fields2568D OpportunityMatcher2569OpportunitySyncStrateD ProsoectSearchStratecim sorcettaisClientTest.phoC DecorateActivityTest.o 45/4DeleteObiectsTraitTest 2Aaanhtntoasieron@ GetActivitvFieldNameT [EMAIL]© QuervHandlerTest.oha© Querviterator Test.oho©QuervResuitsTests.ohepublic function testParseContactPhoneExtIsTruncatedTo10Chars@: voidSservice = Sthis->aerservtcrhock onSermlara= "Phone" =>•[PHONE] ext. 1234567890101C Semcelteston@SwncRatchRedicSenics@ RaseSeniiceTest oho(* CacharCrmSanvirehem 258,st:t::nvokeprvoreherhodldSthis->assertNotNuT (Sosct)ditsv Aocepkhie xeX Reject File [EMAIL] SF fiminny@localhost)console (PROD) Xconsole (STAGING)7827es•104718T AutowINTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner)' ELSE ** END) AS user_id,nen o FRil soctallaccauntssarGTRunCosSontd M.teand*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59actavi tes WHEoE mund to binl:255200/3-8001-1781-0276.66648288185c0= Musde 80186192 Mn* FROM crn_configurations WHERE id = 1853)# console fiaum045 A1 A41 У 66 A* FROM cra_field_data fdAAE ERAAGOM CAAA CAAWSAS6Nacrviies a ol to,aciavity 1d = a.10* fron text relays where created at > *2026-85-91*-* fron actsivities where user id TN (7169, 18688) and created at > '2826-85-22* order by sid desc* fron users where teamsid = 1 and Sid TN (18698, 13934- 2149)-* fron activities where user_id = 7160 order by id desc linit 10;Toon tasne whanda4*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2)TO0У L7Thu 28 May 16:02:30CascaoSllestorcesarice+0.1. parseContactPhone with a real phone number (no ext), and with a phone number that has an extensionmrsciontactnooile wih areal moolle numcer, Witi truncacon 2ho coars.Servicerest.php+80Now ict me verily the tests run. First let me tind the nght test runner commanddester exe/ serckees/cre/5o lsforee/ServiceT/st-pipn -Filtere-testParseContact" 261Could not open input file: /var/www/htmlartisano desker exet deckcr-/am /3 testo re /Se actest pip -f, pte ra testr rsetontact 2561Could not open input file: artisan• docker ps —fomst off.Naresll: 2261 ll hesd -20Bocker-asriadb-1• docker exec docker_lamp_1 bash -c "find / -nane "artisan' -eaxdepth 6 2>/dev/null | heahoseseonslhrttf ptervenest/arsecontact' 2-61*PHPUnit 11.5.55 by Sebastian Bergeann and contributors.Runtime:tion. PHP 8.5.5/now/chounte.11/ 11 (1084Tire: 08:10,988, Memory: (66,80 ME1tile +80 2Ask anything (XOL)AdhotvAcceot all• Owodturlhhmeewhi.est4 spad...
|
NULL
|
-786771730219802476
|
NULL
|
idle
|
ocr
|
NULL
|
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20 rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-proideta cayicepnnhe heloers phitnelereobiecistraicon:©ActivityControlier.php• HttpIntegrationslinteractionsuewholeooserver.ono Teanupc) e enupn;E Jobsclass ServiceTest extends TestCasea MailModelsNotifications24922493 K24942495public function testResolveContactCountryCode(array ScrnData,?bool ScountryExistsvoseivers@ SocialAccountObserverTest, 2497UserObserverTest.php2470AEZAUserRoleObserverTest.phoasuans sconvercedcoderocrans sexoected: void ..Polcies1Usdotpublic static function parseContactPhoneProvider@: array..254425452540*soratnov der parseconcac.Phonerrovzden>EACtVIYDa ActivityProviders2548 ₽public function testParseContactPhoneWithEmotyPhone(array Scrabata, Pstring ScountryCode, array Sexo6a 7145SSlealendanpubazc tuncicion testParsetoncac Phoncazchva-zohunber: vozdTeonterenco7557a erm•Rullmeen& CloseleooneTi HelnersHubspotD IntegrationApplllistenars256425652566u Pioconive(D Salesforce2567 D• (b Fields2568D OpportunityMatcher2569OpportunitySyncStrateD ProsoectSearchStratecim sorcettaisClientTest.phoC DecorateActivityTest.o 45/4DeleteObiectsTraitTest 2Aaanhtntoasieron@ GetActivitvFieldNameT [EMAIL]© QuervHandlerTest.oha© Querviterator Test.oho©QuervResuitsTests.ohepublic function testParseContactPhoneExtIsTruncatedTo10Chars@: voidSservice = Sthis->aerservtcrhock onSermlara= "Phone" =>•[PHONE] ext. 1234567890101C Semcelteston@SwncRatchRedicSenics@ RaseSeniiceTest oho(* CacharCrmSanvirehem 258,st:t::nvokeprvoreherhodldSthis->assertNotNuT (Sosct)ditsv Aocepkhie xeX Reject File [EMAIL] SF fiminny@localhost)console (PROD) Xconsole (STAGING)7827es•104718T AutowINTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner)' ELSE ** END) AS user_id,nen o FRil soctallaccauntssarGTRunCosSontd M.teand*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59actavi tes WHEoE mund to binl:255200/3-8001-1781-0276.66648288185c0= Musde 80186192 Mn* FROM crn_configurations WHERE id = 1853)# console fiaum045 A1 A41 У 66 A* FROM cra_field_data fdAAE ERAAGOM CAAA CAAWSAS6Nacrviies a ol to,aciavity 1d = a.10* fron text relays where created at > *2026-85-91*-* fron actsivities where user id TN (7169, 18688) and created at > '2826-85-22* order by sid desc* fron users where teamsid = 1 and Sid TN (18698, 13934- 2149)-* fron activities where user_id = 7160 order by id desc linit 10;Toon tasne whanda4*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2)TO0У L7Thu 28 May 16:02:30CascaoSllestorcesarice+0.1. parseContactPhone with a real phone number (no ext), and with a phone number that has an extensionmrsciontactnooile wih areal moolle numcer, Witi truncacon 2ho coars.Servicerest.php+80Now ict me verily the tests run. First let me tind the nght test runner commanddester exe/ serckees/cre/5o lsforee/ServiceT/st-pipn -Filtere-testParseContact" 261Could not open input file: /var/www/htmlartisano desker exet deckcr-/am /3 testo re /Se actest pip -f, pte ra testr rsetontact 2561Could not open input file: artisan• docker ps —fomst off.Naresll: 2261 ll hesd -20Bocker-asriadb-1• docker exec docker_lamp_1 bash -c "find / -nane "artisan' -eaxdepth 6 2>/dev/null | heahoseseonslhrttf ptervenest/arsecontact' 2-61*PHPUnit 11.5.55 by Sebastian Bergeann and contributors.Runtime:tion. PHP 8.5.5/now/chounte.11/ 11 (1084Tire: 08:10,988, Memory: (66,80 ME1tile +80 2Ask anything (XOL)AdhotvAcceot all• Owodturlhhmeewhi.est4 spad...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85724
|
2938
|
1
|
2026-05-28T13:02:26.814901+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973346814_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
TextRelayServiceTest
Run 'TextRelayServiceTest'
Debug 'TextRelayServiceTest'
More Actions...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#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","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":"TextRelayServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'TextRelayServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'TextRelayServiceTest'","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}]...
|
1962564511686315741
|
1735522336325714144
|
idle
|
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
TextRelayServiceTest
Run 'TextRelayServiceTest'
Debug 'TextRelayServiceTest'
More Actions
iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O &4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85100% <78• Thu 28 May 16:02:26L881ec2-user@ip-10-30-129-...ec2-user@ip-10-30-140-...₴7...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85723
|
2939
|
1
|
2026-05-28T13:01:59.196126+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973319196_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
TextRelayServiceTest...
|
[{"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","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.8374335,"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":"TextRelayServiceTest","depth":6,"bounds":{"left":0.85272604,"top":0.019952115,"width":0.062832445,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5714658179048184897
|
-8634297297851446848
|
visual_change
|
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
TextRelayServiceTest
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-Proinet va cayicepnnhe heloers phitnelereobiecistraicon:©ActivityControlier.php• HttpIntegrationslinteractionsuewholeooserver.ono Teanupc) e enupn;Jobsclass ServiceTest extends TestCasea MailModelsNotifications2492249324942495public function testResolveContactCountryCode(array ScrnData,?bool ScountryExistsvoseivers@ SocialAccountObserverTest, 2497UserObserverTest.php2470AEZAUserRoleObserverTest.phoasuans sconvercedcoderocrans sexoected: void ..Polciespublic static function parseContactPhoneProvider@: array…….254425452540*sorarnovden parseconcac.Fhonerrovzden>EACtVIYDa ActivityProviders2548 ₽public function testParseContactPhoneWlithEmotyPhone(array ScreData, ?string ScountryCode, array Sexo6a 7145SSlealendanpubac tuncicion tes Parsecontac Phoncuzchva zokunber: vozdTeonterenco7557a erm•Rullmeen& CloseleooneTin HelnersHubspotD IntegrationApplllistenars256425652566u Pioconive(D Salesforce2567• (b Fields2568D OpportunityMatcher2569OpportunitySyncStrateD ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.o 45/4DeleteObiectsTraitTest 2Aaanhtntoasieron© GetActivitvFieldNameT [EMAIL]© QuervHandlerTest.oha© Querviterator Test.oho©QuervResuitsTests.ohepublic function testParseContactPhoneExtIsTruncatedTo10CharsO: voidSservice = sthis->gerServzcrhock orScrmlata = "Phone' =>•[PHONE] ext. 1234567890101C Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest oho(* CacharCrmSanvirehem 258,selt::nvokeprvereherhodkdSthis->assertNotNuT (Sosct)ditsv Aocepkhie xeX Reject File [EMAIL] SF fiminny@localhost)console (PROD) Xconsole (STAGING)7827es•104718T AutowINTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner)' ELSE ** END) AS user_id,nen fo Fril soctal accauntssarGTRunCosSontd M.teand*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59actavi tes WHEoE mund to binl:255200/3-8001-1781-0276.66648288185c0= Musde 80186192 Mn* FROM crn_configurations WHERE id = 1853)# console fiaum045 A1 A41 У 66 4* FROM cra_field_data fdAAE ERAAGOM CAAA CAAWSAS6Nacrviies a UN to.acovity 1d = a.10* fron text relays where created at > +2026-05-91*-* fron actsivities where user id TN (7169, 18688) and created at > '2826-85-22* order by sid desc* fron users where teamsid = 1 and Sid TN (18698, 13934- 2149)-* fron activities where user_id = 7160 order by id desc linit 10;TO0У L7inu co mey toulros+0.that gets parsed, and when there's an extension. Let me also check the TestPrivateMethod trait and the parsephoc 0164 helperahorast Contextexplored helpers.php and scarched 3 queriesNowlnavecwerwninolneo..tih Phes cxisinows.onlycoltneemo.wnullllcan.were.urn.or.ns.o.noarsecontatPhone and parseContactMobite.lneed to adoT. persccontactphone with a feal phone nomoer (no cau, ano witi & phione nomoer tnat nas an extenstonparsecontactMobile with a real mobile number, with truncation (>75 charsServiceTest.phpowhe me venythe tests mn.firstlet me ind the nont toet moner commands destsr extcsdrckers/crm/Soles orce/servitetest.han -fittere"testParseContact™ 2262Could not open input file: /var/www/htmlartisatester exes deckee /ar/3 best re Sevycetest.php -f, fte ra testparsscontact' 2261*Coulo nor oochnouenter anosd• docker ps -format "<(.Names))' 2>61 | head -20docker-sarjadb-1° docker exec docker_lamp_l bash =c "find / -nane "artisan' -naxdepth 6 2>/dev/null | headhose/1minny/arttsano desterexe drckee/er/3 lest re Servicerestephpy f ite vetestParsecontact' 2261°Toon tasne whanda4*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2)1tile +80 2Ask anything (XoL)" HodhAdhotvAccept allIModeuralaimeehiest4 spad...
|
85722
|
NULL
|
NULL
|
NULL
|
|
85722
|
2939
|
0
|
2026-05-28T13:01:54.719235+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973314719_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
TextRelayServiceTest
Run 'TextRelayServiceTest'
Debug 'TextRelayServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.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","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.8374335,"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":"TextRelayServiceTest","depth":6,"bounds":{"left":0.85272604,"top":0.019952115,"width":0.062832445,"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 'TextRelayServiceTest'","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 'TextRelayServiceTest'","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}]...
|
-5599254006743683834
|
-7050965352302034496
|
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
TextRelayServiceTest
Run 'TextRelayServiceTest'
Debug 'TextRelayServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-proideta cayicepnnhe heloers phitnelereobiecistraicon:©ActivityControlier.php• HttpIntegrationslinteractionsuewholeooserver.ono Teanupc) e enupn;Jobsclass ServiceTest extends TestCasea MailModelsNotifications24922493 K24942495public function testResolveContactCountryCode(array ScrnData,?bool ScountryExistsvoseivers@ SocialAccountObserverTest, 2497UserObserverTest.php2470AEZA" UserRoleObserverTest.phoasuans sconvercedcoderocrans sexoected: void ..Polciespublic static function parseContactPhoneProvider@: array..254425452540*scratnovder parseconcac.Fhonerrovzden>EACtVIYDa ActivityProviders2548 ₽public function testParseContactPhoneWlithEmotyPhone(array ScreData, ?string ScountryCode, array Sexo6a 7145SSlealendanpubac tuncicion tes Parsecontac Phoncuzchva zokunber: vozdTeonterenco7557a erm•RullmeenCloseleooneTi HelnersHubspotD IntegrationApplllistenars256425652566u Pioconive(D Salesforce2567 D• (b Fields2568D OpportunityMatcher2569OpportunitySyncStrateD ProsoectSearchStratecim sorcettaisClientTest.phoC DecorateActivityTest.o 45/4DeleteObiectsTraitTest 4%aanhtntoasieron@ GetActivitvFieldNameT [EMAIL]© QuervHandlerTest.oha© Querviterator Test.oho©QuervResuitsTests.ohepublic function testParseContactPhoneExtIsTruncatedTo10Chars@: voidSservice = sthis->gerServzcrhock orScrmlata = "Phone' =>•[PHONE] ext. 1234567890101C Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest oho(* CacharCrmSanvirehem 258,st:t::nvokeprvoreherhodldSthis->assertNotNuT (Sosct)ditsv Aocepkhie xeX Reject File [EMAIL] SF fiminny@localhost)console (PROD) Xconsole (STAGING)7827es•104718Ty: Auto wINTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner)' ELSE ** END) AS user_id,nen fo Fril soctal accauntssarGTRunCosSontd M.teand*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59actavi tes WHEoE mund to binl:255200/3-8001-1781-0276.66648288185c0= Musde 80186192 Mn* FROM crn_configurations WHERE id = 1853)# console fiaum045 A1 A41 У 66 Asles orcesamceTO0У L7inu co moy to.ulror+0.Now I have everything l need. the PR's existing tests only cover the empty/null early-return paths of parsecontactrnone and parscuontactrooste .unced to soo:1. parseContactPhone with a real phone number (no ext), and with a phone number that has an extensionmurson ac Nooe Wilhd real moote numee winttocoddctNow let me verity the tests run. first let me tind the riaht test nunner command)sockerexesdockees /arpsa paptorce/senviceTesteso Leitere*testParseContact" 255)Could not open input file: /var/www/htal/artisar•docker exec docker Nanoswloash -c "co var/mmintoluss ono artotsan tesitesre/lnit/Seruicec/ire/Sallactorce/aricalast.oowiiter"techparcetontacrlrCould not open input file: artisandocker ps -format "((.Names))' 2>8 head -20* FROM cra_field_data fdAAE ERAAGOM CHAA CAAWRACSacrviies a UN to.acovity 1d = a.10* fron text relays where created at > *2026-85-91*-* fron actsivities where user id TN (7169, 18688) and created at > '2826-85-22* order by sid desc* fron users where teamsid = 1 and Sid TN (18698. 13934- 2149)-* fron activities where user_id = 7160 order by id desc linit 10;° docker exec docker_lamp_1 bash =c "find / -name "artisan"axdeoth 6 2s/dew/nulll hoadhose/Atminny/artsantesterext docker/er/3 lestore Sericerestphp f ite etestarstContact' 2261°Pun steShinToon tasne whanda4*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2)1tile +80 2Ask anything (XoL)c HodeAdhotvAccept allwodturlhhmeewhi.est4 spad...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85721
|
2938
|
0
|
2026-05-28T13:01:54.612696+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973314612_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER881DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:01:541₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
6482642436971305306
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2• • 0ShellEditViewSessionScripts|ProfilesW iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER881DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:01:541₴1ec2-user@ip-10-30-140-...₴7...
|
85720
|
NULL
|
NULL
|
NULL
|
|
85720
|
NULL
|
0
|
2026-05-28T13:01:24.496378+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973284496_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
TextRelayServiceTest
Run 'TextRelayServiceTest'
Debug 'TextRelayServiceTest'...
|
[{"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","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":"TextRelayServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'TextRelayServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'TextRelayServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-1678849104122188672
|
593894980799643872
|
idle
|
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
TextRelayServiceTest
Run 'TextRelayServiceTest'
Debug 'TextRelayServiceTest'
iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKERO ₴1DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec-it docker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85ec2-user@ip-10-30-129-...100% <78• Thu 28 May 16:01:241₴1ec2-user@ip-10-30-140-...₴7...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
85719
|
NULL
|
0
|
2026-05-28T13:01:23.321944+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973283321_m2.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20 rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-proideta cayicepnnhe heloers phitnelereobiecistraicon:©ActivityControlier.php• HttpIntegrationslinteractionsuewholeooserver.ono Teanupc) e enupn;E Jobsclass ServiceTest extends TestCasea MailModelsNotifications24922493 K24942495public function testResolveContactCountryCode(array ScrnData,?bool ScountryExistsvoseivers© SocialAccountObserverTest., 2497UserObserverTest.php2470AEZAUserRoleObserverTest.phoasuans sconvercedcoderocrans sexoected: void ..Polcies1Usdotpublic static function parseContactPhoneProvider@: array…….254425452540*sorarnovden parseconcac.Fhonerrovzden>EACtVIYla ActivityProvider:2548 ₽public function testParseContactPhoneWlithEmotyPhone(array ScreData, ?string ScountryCode, array Sexo6a 7145SSlealendanpubac tuncicion tes Parsecontac Phoncuzchva zokunber: vozdTeonterenco7557a erm•RullmeenCloseleooneTi HelnersHubspotD IntegrationApplllistenars256425652566u Pioconive(D Salesforce2567 D• (b Fields2568D OpportunityMatcher2569OpportunitySyncStrateD ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.o 45/4DeleteObiectsTraitTest 4%aanhtntoasieron© GetActivitvFieldNameT [EMAIL]© QuervHandlerTest.oha© Querviterator Test.oho©QuervResuitsTests.ohepublic function testParseContactPhoneExtIsTruncatedTo10Chars@: voidSservice = sthis->gerServzcrhock orSermlara= "Phone" =>*[PHONE] ext. 1234567890101C Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest oho(* CacharCrmSanvirehem, 258,selt::nvokeprvereherhodkdSthis->assertNotNuT (Sosct)ditsv Aocepkhie xeX Reject File [EMAIL] SF fiminny@localhost)console (PROD) Xconsole (STAGING)7827es•104718T AutowINTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner)' ELSE ** END) AS user_id,nen o FRil soctallaccauntssarGTRunCosSontd M.teand*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59actavi tes WHEoE mund to binl:255200/3-8001-1781-0276.66648288185c0= Musde 80186192 Mn* FROM crn_configurations WHERE id = 1853)# console fiaum045 A1 A41 У 66 A* FROM cra_field_data fdAAE ERAAGOM CAAA CAAWSAS6Nacrviies a UN to.acovity 1d = a.10* fron text relays where created at > +2026-05-91*-* fron actsivities where user id TN (7169, 18688) and created at > '2826-85-22* order by sid desc* fron users where teamsid = 1 and Sid TN (18698, 13934- 2149)-* fron activities where user_id = 7160 order by id desc linit 10;TO0У L7inu co wey to.uleCascaolesorcesarice+0.keoo seivicelcatonp #ei-sueLet me see the rest of the test file, especially the helper methods and the new tests added in the PRNothave atulll oicture athe test etthe pe altondy nodk tosteter the emotyint lonses on anecevontac Phoaand parseContactMobite, but is missing the positive/happy-path tests - when there's an actual phone numberthat gets parsed, and when there's an extension. Let me also check the TestPrivatcMethod trait and the parsePhowraconexonisernonontNow I have everything I need. the PR's existing tests only cover the empty/nuli early-return paths of parseContactPhone and parseContactMobile.I need to addt.tscontactrnone with s feul onone numocr tho cau,aho nun&chione nomoer tnat nos an catchstonarsctontac Mooe withia resll mobile number. wiin rinc toonlDyescharConshThet nheNow iet me verity the toste run. Firet let me tind the riaht toat munner command)o desteraxe sovker /ara/ lcst frer/seritet/st-hpn -Filtera* testParseContact" 2061Coule no ooctnounterwarwwhearesa/www/htal 66 php artisan testtt onssCould not open input file: artisa.• docker ps -format "{{.Names))' 2261 head -20Alnetsceanrchdocker-narsadb-1o docker exee docker _lanp_1 bash -c "find / -nane "'artisan" -aaxdepth 6 2>/dev/null T heBToon tasne whanda4*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2)1tile +80 2Ask anything (XOL)" PodnAdhotvAccept allwodturlhhmeewhi.est4 spag...
|
NULL
|
2298013318402150831
|
NULL
|
idle
|
ocr
|
NULL
|
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20 rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-proideta cayicepnnhe heloers phitnelereobiecistraicon:©ActivityControlier.php• HttpIntegrationslinteractionsuewholeooserver.ono Teanupc) e enupn;E Jobsclass ServiceTest extends TestCasea MailModelsNotifications24922493 K24942495public function testResolveContactCountryCode(array ScrnData,?bool ScountryExistsvoseivers© SocialAccountObserverTest., 2497UserObserverTest.php2470AEZAUserRoleObserverTest.phoasuans sconvercedcoderocrans sexoected: void ..Polcies1Usdotpublic static function parseContactPhoneProvider@: array…….254425452540*sorarnovden parseconcac.Fhonerrovzden>EACtVIYla ActivityProvider:2548 ₽public function testParseContactPhoneWlithEmotyPhone(array ScreData, ?string ScountryCode, array Sexo6a 7145SSlealendanpubac tuncicion tes Parsecontac Phoncuzchva zokunber: vozdTeonterenco7557a erm•RullmeenCloseleooneTi HelnersHubspotD IntegrationApplllistenars256425652566u Pioconive(D Salesforce2567 D• (b Fields2568D OpportunityMatcher2569OpportunitySyncStrateD ProsoectSearchStratecim sancettaisClientTest.phoC DecorateActivityTest.o 45/4DeleteObiectsTraitTest 4%aanhtntoasieron© GetActivitvFieldNameT [EMAIL]© QuervHandlerTest.oha© Querviterator Test.oho©QuervResuitsTests.ohepublic function testParseContactPhoneExtIsTruncatedTo10Chars@: voidSservice = sthis->gerServzcrhock orSermlara= "Phone" =>*[PHONE] ext. 1234567890101C Semceltestoo@SwncRatchRedicSenics@ RaseSeniiceTest oho(* CacharCrmSanvirehem, 258,selt::nvokeprvereherhodkdSthis->assertNotNuT (Sosct)ditsv Aocepkhie xeX Reject File [EMAIL] SF fiminny@localhost)console (PROD) Xconsole (STAGING)7827es•104718T AutowINTERVAL 38 DAY.BY u.id, u.email, u.name, u.softphone numben* fron teans where id = 1;NCAT(u.id, CASE WHEN U.id = t.ouner_id THEN ' (ouner)' ELSE ** END) AS user_id,nen o FRil soctallaccauntssarGTRunCosSontd M.teand*EROM ActM tes WHEOF Wund to binl18A2tetth-2147-1817.0144-40480695926801= Musd: * 70033459 V59actavi tes WHEoE mund to binl:255200/3-8001-1781-0276.66648288185c0= Musde 80186192 Mn* FROM crn_configurations WHERE id = 1853)# console fiaum045 A1 A41 У 66 A* FROM cra_field_data fdAAE ERAAGOM CAAA CAAWSAS6Nacrviies a UN to.acovity 1d = a.10* fron text relays where created at > +2026-05-91*-* fron actsivities where user id TN (7169, 18688) and created at > '2826-85-22* order by sid desc* fron users where teamsid = 1 and Sid TN (18698, 13934- 2149)-* fron activities where user_id = 7160 order by id desc linit 10;TO0У L7inu co wey to.uleCascaolesorcesarice+0.keoo seivicelcatonp #ei-sueLet me see the rest of the test file, especially the helper methods and the new tests added in the PRNothave atulll oicture athe test etthe pe altondy nodk tosteter the emotyint lonses on anecevontac Phoaand parseContactMobite, but is missing the positive/happy-path tests - when there's an actual phone numberthat gets parsed, and when there's an extension. Let me also check the TestPrivatcMethod trait and the parsePhowraconexonisernonontNow I have everything I need. the PR's existing tests only cover the empty/nuli early-return paths of parseContactPhone and parseContactMobile.I need to addt.tscontactrnone with s feul onone numocr tho cau,aho nun&chione nomoer tnat nos an catchstonarsctontac Mooe withia resll mobile number. wiin rinc toonlDyescharConshThet nheNow iet me verity the toste run. Firet let me tind the riaht toat munner command)o desteraxe sovker /ara/ lcst frer/seritet/st-hpn -Filtera* testParseContact" 2061Coule no ooctnounterwarwwhearesa/www/htal 66 php artisan testtt onssCould not open input file: artisa.• docker ps -format "{{.Names))' 2261 head -20Alnetsceanrchdocker-narsadb-1o docker exee docker _lanp_1 bash -c "find / -nane "'artisan" -aaxdepth 6 2>/dev/null T heBToon tasne whanda4*foon Antsusty seanch filtene shere actsusty eenoch Sa TM (RRRR) RROp2)1tile +80 2Ask anything (XOL)" PodnAdhotvAccept allwodturlhhmeewhi.est4 spag...
|
85717
|
NULL
|
NULL
|
NULL
|
|
85718
|
2936
|
12
|
2026-05-28T13:00:51.235993+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-28/1779 /Users/lukas/.screenpipe/data/data/2026-05-28/1779973251235_m1.jpg...
|
PhpStorm
|
faVsco.js – ServiceTest.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
TextRelayServiceTest...
|
[{"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","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":"TextRelayServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5714658179048184897
|
-8634297297851446848
|
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
TextRelayServiceTest
iTerm2• • 0ShellEditViewSessionScripts|ProfilesWindowHelp-zshDOCKER881DEV (docker)₴82-zshN3screenpipe"O ₴4-zshapp/Component/ES/Repositories/EsResetActivityRepository.phpapp/Component/KeyPoints/Services/KeyPointsIndexingService.php348+++app/Component/TranscriptionSummary/Services/GetTranscriptionSummaryService.phpapp/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpapp/Models/Activity/Moment.phpapp/Models/Activity/Note.php402116app/Models/CommentAbstract.php++++app/Models/Crm/FieldData.phpapp/Models/ElasticSearch/ActivityElasticSearchTrait.php651+++++++=app/Models/Participant.phpapp/Traits/RequiresUUID.php5scripts/run_command_stagetests/Unit/Component/ActionItems/Services/ActionItemsIndexingServiceTest.phptests/Unit/Component/KeyPoints/Services/GetKeyPointsServiceTest.phptests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phptests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.php71346976++++++++++17 files changed, 472 insertions(+), 22 deletions(-)create mode 100644 app/Component/ActionItems/Services/ActionItemsIndexingService.phpcreate mode 100644 app/Component/KeyPoints/Services/KeyPointsIndexingService.phpcreate mode 100644 app/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingService.phpcreate mode 100644 tests/Unit/Component/ActionItems/Services/ActionItemsIndexingServicelest.phpcreate mode 100644 tests/Unit/Component/KeyPoints/Services/KeyPointsIndexingServiceTest.phpcreate mode 100644 tests/Unit/Component/TranscriptionSummary/Services/TranscriptionSummaryIndexingServiceTest.phplukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ ;xddocker exec-it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"What's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity) $ ;xddockerexec -itdocker_lamp_1 bash-c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"mv: cannot stat '/usr/local/etc/php/conf.d/xdebug.ini': No such file or directoryWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-20963-fix-import-on-deleted-entity)$D‹>0 (|85100% <78• Thu 28 May 16:00:51L81ec2-user@ip-10-30-129-...ec2-user@ip-10-30-140-...₴7...
|
85715
|
NULL
|
NULL
|
NULL
|