|
87317
|
X HubspotYour team is now on the Free plan with 1 X HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties > crm/yklorcosrties criact voe> Resd all oropertiesE Docs Params • Authorization Headers 9 BodySettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoea mensm mn SardCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKera don run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?orooery namev ut Read all oronartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywwendademens do associtoyoCin anandamsnte did aetocitkd on comode.eroeinistow or wocchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Randlalll orooartine oct old call dispositionseflist with associationsCET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311Patси httos://api.hubapi.com/engagements/M1/engaodwwwlh4097305091ert Upaste desl sandиT OLD deal by idCTOUD contaeCMMIDANIENTCSPECS> FLOWSOConndettCoasde em aniooValueWhether to retum only results that have boen archivedKEJSONvVisualizeobtecttuone- "pEAdobsecttyoed""0-3"*Verbal Agreement/Auto Renen*.orobabty":"0.?• Thu 28 May 18:32:13R SaveCookiesBulk Edit200 ok181 mg. 1.94 KRen Save Resnons?E0lhdGorte Vautookteten...
|
iTerm2
|
NULL
|
NULL
|
87317
|
|
87316
|
PostmanFileEditViewWindowActivity MonitorAll Proce PostmanFileEditViewWindowActivity MonitorAll ProcessesProcess Namekernel_taskPhpStormscreenpipereplaydWindowServerPostman Helper (Renderer)mds_storesSlack Helper (Renderer)FirefoxCP Isolated Web ContentcoreaudiodFirefoxActivity MonitorlaunchservicesdbluetoothdAlfredlanguage_server_macos_armFirefoxCP Isolated Web ContentNotion Calendar Helper (Renderer)FirefoxCP Isolated Web ContentWispr FlowSlackFirefoxCP Isolated Web ContentmdsSlack HelperiTerm2Help% CPUCursorUlViewService (Not Responding)PostmanWispr Flow Helper (Renderer)111,285,841,641,530,826,325,424,18,95,53,83,63,33,33,23,23,02,92,52,32,21,91,91,91,91,81,61,5CPU Time24:08:29,214:23:58,023:51:15,236:41:30,538:07:43,077:08,771:10:38,511:00:48,3541:15,881:01:58,521:50:02,219:35,891:04:28,9721:09,311:42,3612:07,5820:04,7710:04,7317:02,214:26,4314:06,881:00,4532:16,2515:33,941:05:03,096:04,253:50,925:44,76System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+30,77%53,24%15,99%CPUED→Jiminny...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messages(L. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan Georgievto VesG. MiraP.. Nikolay Yankov4o James GrahamLukas Kovalik y...::: AppsJira Cloud0all100% (C478•Thu 28 May 18:32:10Describe what you are looking forlliyana Netseva6 0MessagesAdd canvas+lliyana Netv 1 new messageok, thank you 2elliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotNewlliyana Netseva 6:32 PMNo worries, thank you!Message Iliyana Netseva+lliyana Netseva is typing...
|
iTerm2
|
NULL
|
NULL
|
87316
|
|
87315
|
X HubspotwYour team is now on the Free plan with 1 X HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties › crmyklorcoerties crict voe Resd all oropertiesE Docs Params • Authorization Headers 9 BodySettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoeollietmnn sayeCtoe hitory oorteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickersv Uselupest lilter por comanny /onty ocen dent stnoeywwendademens do associtoyoCin anandamsnte did aetocitkd on comode.eroeinistow or wocchy eoou sheut detusersCET SF osuth> e5t Moatina cutcomes der mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with association.сET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311PaTси httos://api.hubapi.com/engagements/M1/engaodwwwlh4097305091ert Uprste desiciandиT OLD deal by idATOUD contaetCNMIDANNENTeSPECS> FLOWSOConndettCoasde em aniooValutWhether to retum only results that have boen archivedKEJSONv> PreviewVisualize"label*: *7. Mon (Contract. Stgned)""probability": *1.0'label": *5. 0ffer Outstanding","label*: *8. Lost (Closed)"• Thu 28 May 18:32:10A SaveCookiesBulk Edit200 ok181 ms. 1.94 KRen Save Resnons?E0lhdGiobnts Monlt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87315
|
|
87314
|
X HubspotYour team is now on the Free plan with 1 X HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties > crm/yklorcosrties criact voe> Resd all oropertiesE Docs Params • Authorization Headers 9 Body ScriptsSettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoelollrentm n SaydCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?orooery namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with association.CET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311Patси httos://api.hubapi.com/engagements/v1/engagewwwlh4097305091ert Upaste desl sandиT OLD deal by idATOUD contaetCMMIDANIENTCSPECS> FLOWSOConndettCoasde em aniooValutWhether to retum only results that have boen archivedKEJSONvPreviewpy Visualizeesult"labol*: "Sales Piocline"dsolavorder:oh"staaas".f"label": *7. Won (Contract Signed)*orobab/lfty*: 41.0UDOXCCA: 2764002151355"label*: *5. Ofter Outstanding".Goohvonder".S,• Thu 28 May 18:32:07R SaveCookiesBulk Edit200 ok181 mg. 1.94 KRen Save ResnonseE0lhdCobr'eVantookttie...
|
iTerm2
|
NULL
|
NULL
|
87314
|
|
87313
|
PostmanFileEditViewWindowHelpActivity MonitorAll P PostmanFileEditViewWindowHelpActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydscreenpipeWindowServerlanguage_server_macos_armFirefoxCP Isolated Web ContentPostman Helper (Renderer)coreaudiodnsattributedstringagentbluetoothdActivity MonitorFirefoxPostmansyspolicydPostman Helper (GPU)iTerm2tccdCursorUlViewService (Not Responding)FirefoxCP Isolated Web ContentWispr FlowcoreduetdClaudeSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)FirefoxCP Isolated Web Content147,31191,61,51,51,51,51,4CPUMemoryEnel•• 0ED→CPU TimeThreadsIdle Wake-UpsKpJiminny ...4:23:53,47270227# infrastructure_devts 16419928108731641992810Unix Timestamp (seconds)1641992810873Unix Timestamp (milliseconds)2022-01-12 13:06:50UTC datetime2022-01-12 15:06:50Local datetime (EET)2022-01-12Date only (EET)15:06:50Time only (24-hour)20220112Compact date (YYYYMMDD)2022-01-12T13:06:50ZISO 8601 UTC (Salesforce)20220112130650Bullhorn format (YYYYMMDDHHmmss)29:43,976711:Todor Stamatov1:00:47,0717:02,082228715Ro Steliyan GeorgievCo Ves20:04,625:44,68248. Mira214:23,7625657+P. Nikolay Yankov4o James GrahamSystem:20,97%Lukas Kovalik y... OUser:46,36%Idle:32,67%::: AppsJira Cloudall100% C8•Thu 28 May 18:32:07Describe what you are looking forlliyana Netseva6 0• Messages+282883₴84285986$7488489Add canvasliyana Netv 1 new messagesk, thank you yeliyana Netseva 5:45 PM1мам питане и се чудя към кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряliyana Netseva 5:56 PMимам сделка която е със статус won но е вlosed lostova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMJS или EU (edited)liyana Netseva 6:01 PMeuJukas Kovalik 6:27 PMзиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotNewlliyana Netseva 6:32 PMNo worries, thank you!Message Iliyana Netsevalliyana Netseva is typing...
|
iTerm2
|
NULL
|
NULL
|
87313
|
|
87312
|
ts 1641992810873
PostmanFileEditViewWindowHelpActi ts 1641992810873
PostmanFileEditViewWindowHelpActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydscreenpipeWindowServerlanguage_server_macos_armFirefoxCP Isolated Web ContentPostman Helper (Renderer)coreaudiodnsattributedstringagentbluetoothdActivity MonitorFirefoxPostmansyspolicydPostman Helper (GPU)iTerm2tccdCursorUlViewService (Not Responding)FirefoxCP Isolated Web ContentWispr FlowcoreduetdClaudeSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)FirefoxCP Isolated Web Content147,31197,3CPU Time4:23:53,47Threads270CPUMemoryIdle Wake-Ups227EnelKptsTime on SteroidsPlease enter now, timestamp and formatted date7:07,371:01:58,223,0721:09,149:35,701:50:02,013:50,8317:29,7038,851:05:02,999:18,416:04,161:00,344:26,311,0729:43,971:00:47,0717:02,0820:04,625:44,684:23, System:User:Idle:39,44%36,49%24,07%ActivityFilesLater..•More+CPUEDJiminny ...# infrastructure_dev# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messages(L. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan GeorgievCo Ves8. MiraP.. Nikolay Yankov4o James GrahamLukas Kovalik y...::: AppsJira Cloudall100% C8•Thu 28 May 18:32:05Describe what you are looking forlliyana Netseva6 0• MessagesAdd canvas+liyana Netv 1 new messagesk, thank you yeliyana Netseva 5:45 PM1мам питане и се чудя към кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotNewlliyana Netseva 6:32 PMNo worries, thank you!Message Iliyana Netseva...
|
Alfred
|
Alfred
|
NULL
|
87312
|
|
87311
|
ts
X HubspotYour team is now on the Free plan with ts
X HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties > crm/yklorcosrties criact voe> Resd all oropertiesE Docs Params • Authorization Headers 9 Body ScriptsSettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoelollrentm n SaydCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?orooery namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with association.CET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311Patси httos://api.hubapi.com/engagements/v1/engagewwwlh4097305091ert Upaste desl sandиT OLD deal by idATOUD contaetCMMIDANIENTCSPECS> FLOWSOConndettCoasde em aniooValutWhether to retum only results that have boen archivedKEJSONvPreviewpy Visualizeesult"labol*: "Sales Piocline"dsolavorder:oh"staaas".f"label": *7. Won (Contract Signed)*orobab/lfty*: 41.0UDOXCCA: 2764002151355"label*: *5. Ofter Outstanding".Goohvonder".S,• Thu 28 May 18:32:05R SaveCookiesBulk Edit200 ok181 mg. 1.94 KRen Save ResnonseE0lhdCobr'eVantookttie...
|
Alfred
|
Alfred
|
NULL
|
87311
|
|
87310
|
Alfred Search Field
PostmanFileEditActivity Monito Alfred Search Field
PostmanFileEditActivity MonitorAll ProcessesProcess NamePhpStormkernel_taskreplaydscreenpipeWindowServerlanguage_server_macos_armFirefoxCP Isolated Web ContentPostman Helper (Renderer)coreaudiodnsattributedstringagentbluetoothdActivity MonitorFirefoxPostmansyspolicydPostman Helper (GPU)iTerm2tccdCursorUlViewService (Not Responding)FirefoxCP Isolated Web ContentWispr FlowcoreduetdClaudeSlack Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)FirefoxCP Isolated Web ContentViewWindowHelp% CPU147,311927,2CPU Time4:23:53,478:07:41,4412:07,4141:15,417:07,371:01:58,223,0721:09,149:35,701:50:02,013:50,8317:29,7038,851:05:02,999:18,416:04,161:00,344:26,311,0729:43,971:00:47,0717:02,0820:04,625:44,684:23,76System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKD DMsActivityFilesLater..•More+26,59%54,17%19,24%CPUEDJiminny...#infrastructure_dev# piatrorm-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan GeorgievEo Ves8. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud0labl100% С8•Thu 28 May 18:32:03Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked huилппимер)Today~гука не сьм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netsevalliyana Netseva is typing...
|
Alfred
|
Alfred
|
NULL
|
87310
|
|
87309
|
X HubspotYour team is now on the Free plan with 1 X HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties > crm/yklorcosrties criact voe> Resd all oropertiesE Docs Params • Authorization Headers 9 Body ScriptsSettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoelollrentm n SaydCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?orooery namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with association.CET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311Patси httos://api.hubapi.com/engagements/v1/engagewwwlh4097305091ert Upaste desl sandиT OLD deal by idATOUD contaetCMMIDANIENTCSPECS> FLOWSOConndettCoasde em aniooValutWhether to retum only results that have boen archivedKEJSONvPreviewpy Visualizeesult"labol*: "Sales Piocline"dsolavorder:oh"staaas".f"label": *7. Won (Contract Signed)*orobab/lfty*: 41.0UDOXCCA: 2764002151355"label*: *5. Ofter Outstanding".Goohvonder".S,• Thu 28 May 18:32:02R SaveCookiesBulk Edit200 ok181 mg. 1.94 KRen Save ResnonseE0lhdCobr'eVantookttie...
|
iTerm2
|
NULL
|
NULL
|
87309
|
|
87308
|
JAlPostmanFileEditViewWindowHelpActivity MonitorAl JAlPostmanFileEditViewWindowHelpActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydscreenpipeWindowServermds_storesFirefoxCP Isolated Web ContentlaunchservicesdcoreaudiodCursorUlViewService (Not Responding)AlfredSlack Helper (Renderer)Activity MonitorRescueTimebluetoothdFirefoxControl CentreFirefoxCP Isolated Web Contentlanguage_server_macos_armPostman Helper (Renderer)mdsWispr FlowFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentIru MenulaunchdFirefoxCP Isolated Web Contentio.kandji.KandjiAgent.ESF-Extension134,6125,863,648,135,432,08,87,3CPU Time4:23:45,7024:08:17,476:41:25,283:51:10,098:07:40,001:10:37,1541:14,981:04:28,781:01:57,906:04,051:42,151:00:46,999:35,537:50,5721:08,941:50:01,8520:48,6520:04,5412:06,797:06,9932:16,134:26,2117:02,001:00,241:26,6019:37,4225:33,9532:05,02System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+29,31%44,12%26,57%CPUED→Jiminny...#infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud0labl100% С8•Thu 28 May 18:32:02Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилоример)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя към кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netsevalliyana Netseva is typing...
|
iTerm2
|
NULL
|
NULL
|
87308
|
|
87307
|
X HubspotYour team is now on the Free plan with 1 X HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties › crmyklorcoerties crict voe Resd all oropertiesE Docs Params • Authorization Headers 9 BodyScriotsSettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoelollrentm n SaydCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKera don run› Iteration run Search HSOR WeonodoksVeOAuthcrm/v3/properties/(object Type>a groups?orooery namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Randlall otochrtias okct old call dispositionseflist with associationsCET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Upaste desl sandиT OLD deal by idCTOUD contaeCMMIDANIENTCSPECS> FLOWSOConndettCoasde em aniooValueDetcrictionWhether to retum only results that have boen archivedCookies1KEJSONvPreview Visualize"results": ("hw, ecles Piodltne"dicolavordor": e.stages":• (Contract Signed)*"displayOrder": 7."nctadata":costoueorobability". "t.e"CrANRAAA". 164100310873-"ntno. os Aifer OutstandineSorohabili*u*. *A26• Thu 28 May 18:32:01A SaveCookiesBulk Edi200 ok181 mg. 1.94 KRen Save ResnonseFelh?Giobnts Montt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87307
|
|
87306
|
JAlPostmanFileEditViewWindowHelpActivity MonitorAl JAlPostmanFileEditViewWindowHelpActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydscreenpipeWindowServermds_storesFirefoxCP Isolated Web ContentlaunchservicesdcoreaudiodCursorUlViewService (Not Responding)AlfredSlack Helper (Renderer)Activity MonitorRescueTimebluetoothdFirefoxControl CentreFirefoxCP Isolated Web Contentlanguage_server_macos_armPostman Helper (Renderer)mdsWispr FlowFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentIru MenulaunchdFirefoxCP Isolated Web Contentio.kandji.KandjiAgent.ESF-Extension134,6125,863,648,135,432,08,87,3CPU Time4:23:45,7024:08:17,476:41:25,283:51:10,098:07:40,001:10:37,1541:14,981:04:28,781:01:57,906:04,051:42,151:00:46,999:35,537:50,5721:08,941:50:01,8520:48,6520:04,5412:06,797:06,9932:16,134:26,2117:02,001:00,241:26,6019:37,4225:33,9532:05,02System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+25,95%27,21%46,84%CPU.ED→Jiminny...#infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...#: AppsJira Cloudlabl100% С8•Thu 28 May 18:32:00Describe what you are looking forlliyana Netseva6 0• Messagest* Add canvas+една заявка (Asked hиилоример)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя към кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netsevalliyana Netseva is typing...
|
iTerm2
|
NULL
|
NULL
|
87306
|
|
87305
|
X HubspotwYour team is now on the Free plan with 1 X HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties > crm/yklorcosrties criact voe> Resd all oropertiesE Docs Params • Authorization Headers 9 Body ScriptsSettingsQuery ParamsKeynарixeуorchivee@ SearchCtpendeoeollietmnn sayeCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with associationsCET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Uprste desiciandиT OLD deal by idCTOUD contaeCNMIDANNENTeSPECS> FLOWSOConndettCoasde em aniooValuttoteWhether to retum only results that have boen archivedKEJSONvPreview Visualize"results": ("dicolavordor": e.stages": !• (Contract Signed)*."displayOrder": 7."nctadata":costoueorobability". "t.e*updatedat": 1764862131359antlo. os oifer OutstandineSorohabili*u*. *A26• Thu 28 May 18:31:59R SaveCookiesBulk Edi200 ok181 mg. 1.94 KRen Save Resnons?Gobr'eVantooke—e...
|
iTerm2
|
NULL
|
NULL
|
87305
|
|
87304
|
JAlPostmanFileEditViewWindowHelpActivity MonitorAl JAlPostmanFileEditViewWindowHelpActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydscreenpipeWindowServermds_storesFirefoxCP Isolated Web ContentlaunchservicesdcoreaudiodCursorUlViewService (Not Responding)AlfredSlack Helper (Renderer)Activity MonitorRescueTimebluetoothdFirefoxControl CentreFirefoxCP Isolated Web Contentlanguage_server_macos_armPostman Helper (Renderer)mdsWispr FlowFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentIru MenulaunchdFirefoxCP Isolated Web Contentio.kandji.KandjiAgent.ESF-Extension134,61252,22,02,01,91,81,8CPUMemoryEnelCPU TimeThreadsIdle Wake-UpsKD4:23:45,70272199ts 17640621313551764062131Unix Timestamp (seconds)1764062131355Unix Timestamp (milliseconds)2025-11-25 09:15:31UTC datetime2025-11-25 11:15:31Local datetime (EET)2025-11-25Date only (EET)11:15:31Time only (24-hour)20251125Compact date (YYYYMMDD)2025-11-25T09:15:31ZISO 8601 UTC (Salesforce)20251125091531Bullhorn format (YYYYMMDDHHmmss)17:02,0028161:00,241:26,602439219:37,4225:33,95429732:05,02System:User:Idle:13,81%34,59%51,61%CPUED→Jiminny ...# infrastructure_dev+:Todor StamatovRo Steliyan GeorgievCo Ves8. MiraP. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloudlabl100% C78•Thu 28 May 18:31:59Describe what you are looking forlliyana Netseva6 0• Messages₴81282₴84*5₴6$87488t Add canvas+една заявка (Asked huилппимер)Today~гука не съм сигурен, по-скоро е за продуктliyana Netseva 4:00 PMok, thank youliyana Netseva 5:45 PM1мам питане и се чудя към кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряliyana Netseva 5:56 PM1мам сделка която е сьс статус won но е вlosed lostova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMJS или EU (edited)liyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netsevalliyana Netseva is typing...
|
iTerm2
|
NULL
|
NULL
|
87304
|
|
87303
|
ts 1764062131355
X HubspotwYour team is now on the ts 1764062131355
X HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties > crm/yklorcosrties criact voe> Resd all oropertiesE Docs Params • Authorization Headers 9 Body ScriptsSettingsQuery ParamsKeynарixeуorchivee@ SearchCtpendeoeollietmnn sayeCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with associationsCET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Uprste desiciandиT OLD deal by idCTOUD contaeCNMIDANNENTeSPECS> FLOWSOConndettCoasde em aniooValuttoteWhether to retum only results that have boen archivedKEJSONvPreview Visualize"results": ("dicolavordor": e.stages": !• (Contract Signed)*."displayOrder": 7."nctadata":costoueorobability". "t.e*updatedat": 1764862131359antlo. os oifer OutstandineSorohabili*u*. *A26• Thu 28 May 18:31:55R SaveCookiesBulk Edi200 ok181 mg. 1.94 KRen Save Resnons?Gobr'eVantooke—e...
|
Alfred
|
Alfred
|
NULL
|
87303
|
|
87302
|
ts
PostmanFileEditViewWindowActivity MonitorAll Pr ts
PostmanFileEditViewWindowActivity MonitorAll ProcessesProcess NamePhpStormkernel_taskreplaydscreenpipeWindowServerPostman Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentcoreaudiodFirefoxPostmanClaudebluetoothdActivity MonitorFirefoxCP Isolated Web Contentlanguage_server_macos_armPostman Helper (GPU)launchservicesdFirefoxCP Isolated Web ContentWispr FlowSlackiTerm2Wispr Flow Helper (Renderer)Karabiner-Core-ServiceFirefoxCP Isolated Web ContentlogdNotion Helper (Renderer)BitwardenHelp% CPU129,2t1,41,41,21,21,11,1CPUMemoryEnelIdle Wake-Ups268KpCPU TimeThreads4:23:38,60272ierm.app/Applications/iTerm.appQuickTime Player.app/Applications/QuickTime Player.appRescueTime.app/Applications/RescueTime.appTextEdit.app/Applications/TextEdit.appTerminal.app/Applications/Utilities/Terminal.appTV.app/Applications/TV.appBetterTouchTool.app/Users/lukas/Applications/Betterfouchtool.appTailscale.app/Applications/Tailscale.appFaceTime.app/Applications/FaceTime.app5:44,53216520:53,554:41,58164617:16,9425:18,08264202:32,67446System:User:Idle:26,77%39,50%33,74%ED→Jiminny ...# infrastructure_dev+CPU.:Todor StamatovRo Steliyan GeorgievEo Ves8. MiraP. Nikolay Yankov4o James GrahamLukas Kovalik y….::: AppsJira Cloudlabl100% C78•Thu 28 May 18:31:54Describe what you are looking forlliyana Netseva6 0• Messages282883₴84*5₴6$87488t Add canvas+една заявка (Asked huилппимер)Today~гука не съм сигурен, по-скоро е за продуктliyana Netseva 4:00 PMok, thank youliyana Netseva 5:45 PM1мам питане и се чудя към кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряliyana Netseva 5:56 PM1мам сделка която е сьс статус won но е вlosed lostova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMJS или EU (edited)liyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netsevalliyana Netseva is typing...
|
Alfred
|
Alfred
|
NULL
|
87302
|
|
87301
|
SlackFileEditViewGoHistoryWindowHelpActivity Monit SlackFileEditViewGoHistoryWindowHelpActivity MonitorAll ProcessesProcess Name% CPUCPU TimePhpStormkernel_taskreplaydscreenpipeWindowServerPostman Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentcoreaudiodFirefoxPostmanClaudebluetoothdActivity MonitorFirefoxCP Isolated Web Contentlanguage_server_macos_armPostman Helper (GPU)launchservicesdFirefoxCP Isolated Web ContentWispr FlowSlackiTerm2Wispr Flow Helper (Renderer)Karabiner-Core-ServiceFirefoxCP Isolated Web ContentlogdNotion Helper (Renderer)Bitwarden129,24:23:38,6090,955,042,024:08:10,836:41:21,923:51:07,558:07:38,147:06,8420:04,3941:14,521:01:57,521:50:01,693:50,6129:43,8121:08,779:35,3417:01,8812:06,6438,681:04:28,401:00,134:26,0914:06,691:05:02,795:44,5320:53,554:41,5817:16,9425:18,082:32,67System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp ,64%36,02%42,34%HomeDMsActivityFilesLater..•More+ED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messages(L. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan GeorgievEo Ves8. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:53Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87301
|
|
87300
|
VieWWinoowX HubspotwYour team is now on the Free p VieWWinoowX HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or uegrade to restore collaborationProperties › crmiyk orcoerties crinct ma> Resd all propertiesE Docs Params • Authorization Headers 9 Body ScriptsSettingsQuery ParamsKeynарixeуorchivee@ SearchCtpendeoeollietmnn sayeCoe hitor nonteOET ReadCedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with associationsCET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3/cb.ecte/meet.nos/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Uprste desiciandиT OLD deal by idCTOUD contaeCNMIDANNENTeSPECS> FLOWSOConndettCoasde em aniooValuttoteWhether to retum only resutts that have boen archivedKEJSONvPreview Visualize"results": ("dicolavordor": e.stages":• (Contract Signed)*"displayOrder": 7."nctadata":costonueorobability". "t.e"CrANRAdA": 16410028108751antlo. os oifer Outstandineorohahilitu". *A. 267o0sLXThu 28 May 18:31:5%R SaveSondCookiesBulk Ed200 ok181 mg. 1.94 KRen Save ResnonseGiobnts Montt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87300
|
|
87299
|
VieWWinoowX HubspotYour team is now on the Free pl VieWWinoowX HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or uegrade to restore collaborationProperties › crmyk orcoerties crinct ma> Resd all propertiesE Docs Params • Authorization Headers 9 BodySettinasQuery ParamsKeynарixeуorchivee@ SearchCrpendonelollrentm n SaydCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOR WeonodoksVeOAuthcrm/v3/properties/(object Type>a groups?orooery namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Randlall otochrtias okct old call dispositionseflist with associationsCET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3/cb.ecte/meet.nos/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Upaste desl sandиT OLD deal by idCTOUD contaeCMMIDANIENTCSPECS> FLOWSOConndettCoasde em aniooValueDetcrictionWhether to retum only resutts that have boen archivedKEJSONvPreview Visualize"results": ""hw, ecles Piodltne"dicolavordor": e.stages": !• (Contract Signed)*."displayOrder": 7."nctadata":costoueorobability". "t.e"CrANRAAA". 164100310873-"ntno. os Aifer OutstandineSorohabili*u*. *A267o0sLXThu 28 May 18:31:51R SaveCookiesBulk Edi200 ok181 mg. 1.94 KRen Save ResnonseGiobnts Montt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87299
|
|
87298
|
IAlSlackFileEditViewGoActivity MonitorAll Processe IAlSlackFileEditViewGoActivity MonitorAll ProcessesProcess NamePhpStormkernel_taskWindowServerreplaydscreenpipePostman Helper (Renderer)Postmanmds_storesFirefoxCP Isolated Web ContentcoreaudiodClaudePostman Helper (GPU)bluetoothdActivity MonitorMTLCompilerServicelanguage_server_macos_armFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr FlowSlack Helper (Renderer)ierm2launchservicesdFirefoxKarabiner-Core-ServiceFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)HistoryWindow% CPUCursorUlViewService (Not Responding)TouchBarServer120,290,143,540,638,816,210,910,58,25,3HelpCPU Time4:23:31,7724:08:06,038:07:36,176:41:19,023:51:05,337:05,633:50,411:10:35,4541:14,091:01:57,2529:43,6138,5521:08,589:35,180,8712:06,5117:01,741:00,004:26,001:00:46,751:05:02,721:04:28,261:50:01,4620:53,4720:03,885:44,466:03,816:38,75System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp ,38%36,58%36,04%HomeDMsActivityFilesLater..•More+ED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan GeorgievEo VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:50Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87298
|
|
87297
|
WinoowX HubspotYour team is now on the Free plan w WinoowX HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or uegrade to restore collaborationProperties › crmyk orcoerties crinct ma> Resd all propertiesE Docs Params • Authorization Headers 9 BodySettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoelollrentm n SaydCoe hitor nonteOET Readcedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with associationsCET list engagements okert recent enaaaement.cet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3/cb.ecte/meet.nos/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Upaste desl sandиT OLD deal by idCTOUD contaeCMMIDANIENTCSPECS> FLOWSOConndettCoasde em aniooValueDetcrictionWhether to retum only resutts that have boen archivedKEJSONv868388808380004Preview Visualize"results": ""hw, eChles Piodline"dicolavordor": e.stages": !• (Contract Signed)*."displayOrder": 7."nctadata":orobability". "1.e""CYANRAdAR": 1641002810873orohahilitu". *A. 267o0sLXThu 28 May 18:31:49# SaveCookiesBulk Edit200 dk181 ms. 1.94 KR.en Save Resnons?Felh?Giobnts Monlt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87297
|
|
87296
|
IAlSlackFileEditViewGoActivity MonitorAll Processe IAlSlackFileEditViewGoActivity MonitorAll ProcessesProcess NamePhpStormkernel_taskWindowServerreplaydscreenpipePostman Helper (Renderer)Postmanmds_storesFirefoxCP Isolated Web ContentcoreaudiodClaudePostman Helper (GPU)bluetoothdActivity MonitorMTLCompilerServicelanguage_server_macos_armFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr FlowSlack Helper (Renderer)ierm2launchservicesdFirefoxKarabiner-Core-ServiceFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)HistoryWindow% CPUCursorUlViewService (Not Responding)TouchBarServer120,290,143,540,638,816,210,910,58,25,3HelpCPU Time4:23:31,7724:08:06,038:07:36,176:41:19,023:51:05,337:05,633:50,411:10:35,4541:14,091:01:57,2529:43,6138,5521:08,589:35,180,8712:06,5117:01,741:00,004:26,001:00:46,751:05:02,721:04:28,261:50:01,4620:53,4720:03,885:44,466:03,816:38,75System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp ,33%49,95%25,73%HomeDMsActivityFilesLater..•More+ED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan GeorgievEo VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...#: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:49Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87296
|
|
87295
|
IAlSlackFileEditViewGoHistoryWindowActivity Monito IAlSlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydscreenpipePostman Helper (Renderer)WindowServerFirefoxCP Isolated Web ContentcoreaudiodlaunchservicesdlaunchdPostmanFirefoxbluetoothdActivity MonitorPostman Helper (GPU)MTLCompilerServicelanguage_server_macos_armFirefoxCP Isolated Web ContentClaudeiTerm2Wispr FlowFirefoxCP Isolated Web ContentSlackFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentControl CentreWispr Flow Helper (Renderer)TouchBarServer148,798,060,043,432,130,27,55,54,74,14,03,93,53,33,13,02,82,42,42,32,21,91,91,71,71,51,51,4HelpCPU Time4:23:25,4324:08:01,286:41:16,873:51:03,287:04,788:07:33,8741:13,651:01:56,961:04:28,1819:37,263:49,831:50:01,3821:08,399:35,0038,340,7312:06,3743:56,2229:43,351:05:02,624:25,9059,9014:06,5911:52,6917:01,6420:48,405:44,386:38,69System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp ,36%44,96%29,68%HomeDMsActivityFilesLater..•More+ED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko Kashinski. Galya Dimitrova: Todor StamatovRo Steliyan GeorgievEo VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:43Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87295
|
|
87294
|
VieWWinoowX HubspotwYour team is now on the Free p VieWWinoowX HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or uegrade to restore collaborationProperties › crmiyk orcoerties crinct ma> Resd all propertiesE Docs Params • Authorization Headers 9 Body ScriptsSettinasQuery ParamsKeynарixeуorchivee@ SearchCtpendeoeollietmnn sayeCoe hitor nonteOET ReadCedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywnendademens oo associa.tovoCit anandsmante did actocitid on comode.perceiinistow or docchy eoou sheut detusersCET SF osuth> est Moatina cutcomes per mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with associationsCET list engagements okert recent enasaementecet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3/cb.ecte/meet.nos/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Uprste desiciandиT OLD deal by idCTOUD contaeCNMIDANNENTeSPECS> FLOWSOConndettCoasde em aniooValueDetcrictionWhether to retum only resutts that have boen archivedKEJSONvCookies 1 Hoaders. ?TAut PAtTidPreview Visualize"dicolavordor": e.stages":• (Contract Signed)*"displayOrder": 7."nctadata":costonueorobability". "t.e"CYANRAdAR": 1641002810873orohahilitu". *A. 26Thu 28 May 18:31:43R SaveSondCookiesBulk Ed?200 ok181 ms. 1.94 KR.Man Save Resnons?= 0100Giobnts Montt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87294
|
|
87293
|
IAISlackFileEditViewGoHistoryWindowActivity Monito IAISlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydWindowServerscreenpipePostman Helper (Renderer)FirefoxCP Isolated Web ContentcoreaudiodPostmanFirefoxCP Isolated Web ContentbluetoothdActivity MonitorPostman Helper (GPU)launchservicesdFirefoxFirefoxCP Isolated Web ContentMTLCompilerServicelanguage_server_macos_armSlackFirefoxCP Isolated Web ContentWispr FlowFirefoxCP Isolated Web ContentiTerm2ClaudeFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)Slack Helper (Renderer)152,4123,054,040,132,211,69,65,53,73,73,53,53,33,13,13,13,03,02,62,52,12,11,61,61,51,51,41,4HelpCPU Time4:23:17,6124:07:56,126:41:13,728:07:32,283:51:00,997:03.0941:13,261:01:56,673:49,6224:11,8221:08,219:34,8238,181:04:27,931:50:01,1843:56,090,5712:06,2214:06,4917:01,554:25,7959,801:05:02,5029:43,2232:29,5513:39,155:44,301:00:46,60System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp ,10%56,08%8,82%HomeDMsActivityFilesLater..•More+ED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan GeorgievEo VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:41Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87293
|
|
87292
|
WinoowX HubspotYour team is now on the Free plan w WinoowX HubspotYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or uegrade to restore collaborationProperties › crmiyk orcoerties crinct ma> Resd all propertiesE Docs Params • Authorization Headers 9 BodySettingsQuery ParamsKeynapixeyorchivee@ SearchCrpendonelollrentm n SaydCoe hitor nonteCEr RendCedet meetinoV COLLECYIONSEngsgements› HubspotKera don run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywwendademens do associtoyoCin anandamsnte did aetocitkd on comode.?eroeinistom or wocchy eoesooeut aet usersCET SF osuth> e5t Moatina cutcomes der mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with association.сET list engagements okert recent enaaaement.cet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3/cb.ecte/meet.nos/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Upaste desl sandиT OLD deal by idATOUD contaetCMMIDANIENTCSPECS> FLOWSEConnnettPoasolewwsotoodValuetoteWhether to retum ooly results that have been archived.KEJSONvPreview Visualize86836803380004invoice intoration*hasUniqueValue*: falserasddalsWalma". Ealedarasenstwwnen senseye7o0sLXThu 28 May 18:31:41# SaveCookiesBulk Edi700 ok 204ms. 29.6A KRen Save Resnons?= 0100Giobnts Monlt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87292
|
|
87291
|
WinoowX HubspotwYour team is now on the Free plan WinoowX HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or uegrade to restore collaborationProperties › crmiyk orcoerties crinct ma> Resd all propertiesE Docs Params • Authorization Headers 9 BodySettingsQuery ParamsKeynapixeyorchivee@ SearchCrpendeoea menim m sordCoe hitor oonteCEr RendCedet meetinoV COLLECYIONSEnasgements› HubspotKera don run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoy Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny / onty ocen dent sthoeywwendademeas do associtoyoCin anandamante did aetocitkd on comode.?eroeinistom or wocchy eoesooeut detusersCET SF osuth> e5t Moatina cutcomes der mectind> cEt Read all properties newCin Rand alll oronartiaeoelct old call dispositionseflist with association.сET list engagements olert recent enaaaement.cet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3/cb.ecte/meet.nos/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231eat Upaste desl siandиT OLD deal by idCTOUD contaetCMMIDANIENTCSPECS> FLOWSOConnnettPoasolewwsotoodValuetoteWhether to retum ooly results that have been archived.KEJSONvPreview Visualize86836803380004invoice intoration"hasUniqueValue": falselrasddalsWalma". Ealedarasenstwwnen senseyeo0sLXThu 28 May 18:31:40# SaveCookiesBulk Edi700 ok 204ms. 29.6A KRen Save Resnons?= 0100Giobnts Monlt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87291
|
|
87290
|
IAISlackFileEditViewGoHistoryWindowActivity Monito IAISlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydWindowServerscreenpipePostman Helper (Renderer)FirefoxCP Isolated Web ContentcoreaudiodPostmanFirefoxCP Isolated Web ContentbluetoothdActivity MonitorPostman Helper (GPU)launchservicesdFirefoxFirefoxCP Isolated Web ContentMTLCompilerServicelanguage_server_macos_armSlackFirefoxCP Isolated Web ContentWispr FlowFirefoxCP Isolated Web ContentiTerm2ClaudeFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)Slack Helper (Renderer)152,4123,054,040,132,211,69,65,53,73,73,53,53,33,13,13,13,03,02,62,52,12,11,61,61,51,51,41,4HelpCPU Time4:23:17,6124:07:56,126:41:13,728:07:32,283:51:00,997:03.0941:13,261:01:56,673:49,6224:11,8221:08,219:34,8238,181:04:27,931:50:01,1843:56,090,5712:06,2214:06,4917:01,554:25,7959,801:05:02,5029:43,2232:29,5513:39,155:44,301:00:46,60System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+15,82%30,52%53,66%CPU.ED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana NetsevaEo Vasil Vasilev&. Stefka Stoyanovao Stoyan Tomovo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan GeorgievCo VesG. MiraP.. Nikolay Yankov4o James GrahamLukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:40Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87290
|
|
87289
|
IAISlackFileEditViewGoHistoryWindowActivity Monito IAISlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydWindowServerscreenpipePostman Helper (Renderer)FirefoxCP Isolated Web ContentcoreaudiodPostmanFirefoxCP Isolated Web ContentbluetoothdActivity MonitorPostman Helper (GPU)launchservicesdFirefoxFirefoxCP Isolated Web ContentMTLCompilerServicelanguage_server_macos_armSlackFirefoxCP Isolated Web ContentWispr FlowFirefoxCP Isolated Web ContentiTerm2ClaudeFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentWispr Flow Helper (Renderer)Slack Helper (Renderer)152,4123,054,040,132,211,69,65,53,73,73,53,53,33,13,13,13,03,02,62,52,12,11,61,61,51,51,41,4HelpCPU Time4:23:17,6124:07:56,126:41:13,728:07:32,283:51:00,997:03.0941:13,261:01:56,673:49,6224:11,8221:08,219:34,8238,181:04:27,931:50:01,1843:56,090,5712:06,2214:06,4917:01,554:25,7959,801:05:02,5029:43,2232:29,5513:39,155:44,301:00:46,60System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+20,34%24,57%55,09%CPU.ED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana NetsevaEo Vasil Vasilev&. Stefka Stoyanovao Stoyan Tomovo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan GeorgievEo VesG. MiraP.. Nikolay Yankov4o James GrahamLukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:39Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87289
|
|
87288
|
WinoowX HubspotwYour team is now on the Free plan WinoowX HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or ungrade to restore collaborationProperties > crm/yklorcosrties criact voe> Resd all oropertiesE Docs Params • Authorization Headers 9 BodySettinasQuery ParamsKeynарixeуorchiveeobjectTypo@ Searcherpendonea menim m sordCoe hitor nonteOET ReacCedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOaRWeonocoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oropartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywwendademens do associtoyoCin anandamsnte did aetocitkd on comode.?eroeinistom or wocchy eoesooeut detusersCET SF osuth> e5t Moatina cutcomes der mectind> cEt Read all properties newCin Randl alll oronartiae ofct old call dispositionseflist with association.CET list engagements okert recent enaaaement.cet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3lob.ecte/meet0os/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Upaste desl sandиT OLD deal by idCTOUD contaeCNMIDANNENTeSPECS> FLOWSEConnnettPoasolewwsotoodValueVolddonWhether to retum ooly results that have been archived.RoottodKEJSONv86836803380004Preview Visualizeinvoice intoration"hasUniqueValue": falselrasddalsWalma". Ealedarasenstwwnen senseyeThu 28 May 18:31:33# SaveCookiesBulk EditRutke Shoe200 OK - 204 ms - 29.64 KB - G8ae. Save Response= 0100Giobnts Monlt Tookemem...
|
iTerm2
|
NULL
|
NULL
|
87288
|
|
87287
|
SlackFileEditViewGoHistoryWindowHelpActivity Monit SlackFileEditViewGoHistoryWindowHelpActivity MonitorAll ProcessesProcess Name% CPUCPU TimePhpStormkernel_taskreplaydscreenpipeWindowServerFirefoxCP Isolated Web ContentcoreaudiodFirefoxActivity MonitortccdPostman Helper (Renderer)syspolicydbluetoothdlaunchservicesdlanguage_server_macos_armWispr FlowFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentFirefoxCP Isolated Web Contentierm2FirefoxCP Isolated Web ContentSlack Helper (Renderer)Notion Helper (Renderer)trustdWispr Flow Helper (Renderer)FirefoxCP Isolated Web ContentBiomeAgent145,04:23:09,53136,854,537,724:07:49,606:41:10,853:50:59,2920,88:07:30,168,941:12,751:01:56,381:50:01,019:34,649:18,227:02,4717:29,4021:08,021:04:27,7712:06,064:25,6743:55,9359,6920:03,6717:01,421:05:02,425:13,491:00:46,5225:17,855:21,505:44,2332:29,471,41System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+36,07%26,15%37,78%CPUED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor StamatovRo Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:32Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
iTerm2
|
NULL
|
NULL
|
87287
|
|
87286
|
WinoowX HubspotwYour team is now on the Free plan WinoowX HubspotwYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissicas to see who can edit, or uegrade to restore collaborationProperties › crmiyk orcoerties crinct ma> Resd all propertiesE Docs Params • Authorization Headers 9 BodySettinasQuery ParamsKeynарixeуorchiveeobjectTypo@ Searcherpendonea menim m sordCoe hitor nonteOET ReacCedet meetinoV COLLECYIONSEngsgements› HubspotKeradon run› Iteration run Search HSOR WeonodoksVeOAuthcrm/v3/properties/(object Type>a groups?-olOoery Namev ut Read all oronartiesee successtul operationenAn error occurred.Rotcteae8 orooey• ЗLАKCHTickarsv Uselupest lilter por comanny /onty ocen dent stnoeywwendademens do associtoyoCin anandamsnte did aetocitkd on comode.?eroeinistom or wocchy eoesooeut detusersCET SF osuth> e5t Moatina cutcomes der mectind> cEt Read all properties newCin Randlall otochrtias okct old call dispositionseflist with association.CET list engagements okert recent enaaaement.cet get dealMiGatemadsmentmiPATCH httos://api.hubapi.com/engagements/v1/engagements/24927395231patckhttocdllaolhubant.com/crm/v3/cb.ecte/meet.nos/24927/3952311PATCи httos://api.hubapi.com/engagements/V1/engagements/24927395231ert Upaste desl sandиT OLD deal by idCTOUD contaeCNMIDANNENTeSPECS> FLOWSEConnnettPoasolewwsotoodValueVolitdonWhether to retum ooly results that have been archived.RoottodKEJSONv86836803380004Preview Visualizeinvoice intornation"hasUniqueValue": falselrasddalsWalma". Ealedarasenstwwnen senseyeThu 28 May 18:31:32R SaveSondCookiesBulk EditRutke Shoe200ok204m. 29.64 KRae. Save Response=Q00Gorte Vautookttien...
|
iTerm2
|
NULL
|
NULL
|
87286
|
|
87285
|
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
Code changed:
rapstomViewNeweNNCCoocKetucioTOOI-WindowFV faVsco.s ~#12121 on JY-20963-fx-inCSamviceTesconrcteamoremo tewineResponseNormalize.phoUmacurayochict.on© RecordSelector.phggsevice.on:OpportunitySyncTrait.php© CrmEntityRepository.phgesunchicracoon.onclass service excenos baseservace aolesencsGSUNCKOlOhCWWWKeweonooinlneochhoe>D IntearationAod>O Listeners>& Metadata> D Migration>Da Pipedrivev Salestorce•D Feldsa opoortunitvVatchenOpportunitySyncStrategy> ProspectsearchStrategyeSemicetiraitsCeentone© DecorateActivity.cholnaldtsor weetihooo2091209520962100oead natioitionenno© PayloadBuilder.php@ Profile.php© QueryBuilder.pho© QueryHandler.php© Queryiterator.pho© QueryResults.phpe Sarnce oho© SyncBatchRedisService.pthTinltel( RaseCllent phoa RoenSerice choC CachedCrmServiceDecorator coniooekesowod€ CrmActivitvProviderinteorateCCINTCMINMOron© CrmConficurationSettinasSer@[EMAIL] DefaultProspectSearchStrate@ FindsProspectinterface.nhoC) LavoutMansoer ono3 MatchDomsinsvams nterseC Opportun tvActvityMatchereoportun tySyncStratcointec @pportun tySyncStratcoweec Prosoectenche.ond@ ProsoectSearchScooc.nhocOrnenontCostchCtttammA PrnenontSonrch Gtetondoto21etei orawdoroo etr nhnDorarriColontor nhopubuzc tunccion savelranscrzpczonsuaryasnotelsorind sarlestring $body,Psirind soonecid.?NoteObject Snote0bject = null,De Pstrind fi.ucacaspublic function attachSunnaryToActivity(ActivityContract Sactivity, string SsunnaryTitle, string SsunnaryC 170€1 usageprivate function buildMetadataForSumnaryUpdate(Activity Sactivity, string Ssunnary): array(...}public function fetchAndAssoclateRelatedAct_vity(Activity Sactivity): ?Activityi...}public function fetchRelatedActivity(Activity Sactivity): array{...,5 usage"public function getDealsInBulk(array SdealIds): arrayk...* Extract deal IDs fron HubSpot search response* Boanam arrau ShubspotResponse The raw HubSpot search API response* Bpacam bool SincludeArchived Whether to include archived deals (default: false).* Breturn stringil Arrau of deal 10s as strinas8 usagespublic function extractDealids(array ShubspotResponse, bool SincludeArchived = false): arravf....public functaion natchActivityEngagenentTvpe(Activity Sactivity): stoingi...onivate function assiantendunen(liser Suser. Activitutontract Sactivitul. apcosilel..1 usaggprivate static function getdealsPipelinesEndpointO: stringreturn self::API_URL . self::ENDPOINT_PIPELINES . self::PIPELINE_OBJECT_TYPE_DEALS;oubl&e funation vonsfuThckfysetetAativity Coctsustrl. hooldTO0У L7inu co moy tostServiceTest+0.=custom.loglaravel.lodA SF jiminny@localhostA console (PRODasaasforce/Service.oneA console (EU) X uin users (EU# console [STAGINGDe00tTe uto178017811782178.—[CREDIT_CARD]—170)-713=1711=1714=171517161728E17221723E1724- 1725I MII17301II•1731-173%4-7332=1736= 173€PlaygroundOojiminnyORDER BY SMS COunT DESC031 49 A29 V 3 У 109 A 1SeLen ossNct usid, urenal, u,nane, u,ream io tunane as team namelt.twilto_sns-sid, t.twillo.nessaging.s.FROM users uINNER JOIN teans t (1.n<->1: ON U.tean_id = t.idWHERE (t.twilio_sns_sid IS NOT NULL OR t.twiLio_nessaging_sid IS NOT NULL)AND U.status = 1ORDER BY t.name, u.enail;SELECT * FROM teans WHERE nane LIKE "XTourhancx"; = 187, 209, 8150, salesforce-adnindt:CELECTCONCAT(u.id, CASE WHEN u.id = t.ownerid THEN " (ouner)' ELSE "* END) AS userid_Eo omner.id FROM social. accounts saT0TM neone mon mide ea cocfahlo i.JOIN teams t 1.n<->1: on t.id = u.tean iWHERE v.team id = 187 and sa.provider = 'salesforce':coloлt & Eanm 0At/v2+ão6 hono 17 - 7124/247.Seler*shere 1d = 6331639:select * from accounts where id = 4156632;select * from oppontunitiles where 1d = 4843618:# update 'activities" set 'account_id* = 4156632,consaasyooooruny# 'stage 1d' = 13273)acowoesueesihod tomheneeyaselect * from text nelaus where created at > 12826-85-81°-select * fron actsivitsies onden by fid desciselect * fron usene nhere nane Like igSubrnke,SELECT * FROM onnontunities WHERE wnid.to_binf+04a9c6ad-2687-4453-9072-28aeb28ccf8d*)select * from teans where id = 555;select *rom stages where tean.iide S5ssCELECTCONCAT(u.id, CASE WHEN u.id = t.owner id THEN " (ouner)' ELSE ** END) AS user idaomaslt.owner_id FROM sociat_accounts sainiM ncone nan wdeacosahloJOIN teams t 1.n<->1: on t.id = u.tean idWHERE U.team id = 100 and sa.provider = 'hubspot':Cascadeles Orcnnworeeoeionhnves dohtine OooondPitocottoe nhcoo..orobabuty" s Tloat (icatalcetadata"orobabto tym)hThis s the root causeHere's the full explanation:Root eause:moor Stages overwmes D 8 orobablliy with Huosoor's valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44 . The stage crm provider 1d: "closedtost" isHubSpot's standard "Closed Lost" stage which natively has probability ® in HubSpot.2. ImportStages() runs (during any pipeline/stage sync), It callsService.php:445-454Sstage = Sthis->config-ostages()-withTrashed()->update0rCreate(l"crm_provider_1d a 55l-10"JPebbsitencetorosbliew'113. sattorobabsKtu"1 comas from RestonscNorentaer.roms WrebenlStaoe"orobability" a (4loat) (Saataf"retadata"|("orobabfWity'122 1.HubSpot returns netadata.probability = e for closedlost. So $s['probability") * 100 • 0. This resets stage 20616's probability back to 0 in tho4. Now getClosedDealStaces() outs "closedlost" into lostll (orobability 0), not woni5. The deal syncs → is_von = false, is_closed = truetha connonss of muonte.May 4After May 4Stace 20616 probability manually changed to 100 in Jiminny DAmortStanes () runr → resetr staae 20616 probability back to 0 (frem HubSpot)May 20Dral synos → *closedlost» is in lostll (orob=0) = ts won = falarThe opportunitye atane ta in etill 20616 (the stage reeord ID never changed), but by the time it suncad on May 20, iroortStages had already resct theprobability of that stage back to 0. So when buf ldOpportunityData runs, "closedlost" is in tost(Il, not von!!The core issue: inportStages always overwrites the DB probability with whatever HubSpot says. Any manual probability customisation in Jiminny getswiped out the next time stages are synoed from HubSpot. Stage 20616 was manually set to 100 but the label says *7. Won (Contract Signed)" while thiHibSoot em omuider da le cloadilost = HibSootte nativa orobability for that is Ouso ft cate racatGuntaAt anthientua$ Adhotswtt//Wiawoutteoueettodaw 1ReyM Woderd Teams 2159:40 UTE-R Al/A enod...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87285
|
|
87284
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
149
1
33
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm\Hubspot;
use Carbon\Carbon;
use Exception;
use Generator;
use GuzzleHttp\Exception\RequestException;
use HubSpot\Client\Crm\Owners\Model\PublicOwner;
use Illuminate\Support\Facades\Cache;
use InvalidArgumentException;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SavePlaybackLinkToCrmInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Contracts\Services\Crm\VerifyTaskExistsInterface;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Participant;
use Jiminny\Models\Playbook;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\ParticipantRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\Hubspot\Actions\SyncArchivedProfilesAction;
use Jiminny\Services\Crm\Hubspot\Fields\ValueNormalizer;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\OpportunitySyncTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncFieldsTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\WriteCrmTrait;
use Jiminny\Services\Crm\MatchDomainByEmailInterface;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Services\Crm\ResolveCompanyNameByEmailTrait;
use Jiminny\Utils\PlaybackUrlBuilder;
use Sentry;
use SevenShores\Hubspot\Exceptions\BadRequest;
use Throwable;
use UnexpectedValueException;
/**
* @phpstan-type CrmFieldDefinition array{
* name: string,
* label: string,
* description: string,
* type: string,
* fieldType: string,
* hidden: bool,
* showCurrencySymbol: bool,
* options: array<array{
* id: string,
* label: string,
* value?: string,
* }
*/
class Service extends BaseService implements
HubspotInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
SendSummaryToCrmInterface,
MatchDomainByEmailInterface,
SavePlaybackLinkToCrmInterface,
RemoteEntityManipulationInterface,
FetchRelatedActivityInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
VerifyTaskExistsInterface
{
use ResolveCompanyNameByEmailTrait;
use SyncCrmEntitiesTrait;
use WriteCrmTrait;
use SyncFieldsTrait;
use OpportunitySyncTrait;
private const int ENGAGEMENT_BODY_MAX_LENGTH = 65536;
private const string LOG_DATE_FORMAT = 'Y-m-d H:i:s';
private const int BATCH_UPDATE_LIMIT = 100;
private const string TEN_SECONDLY_ROLLING_POLICY = 'TEN_SECONDLY_ROLLING';
private const int TEN_SECONDLY_ROLLING_LIMIT = 10;
private const string CALLS_SEARCH_ENDPOINT = '[URL_WITH_CREDENTIALS] ClientInterface|Client
*/
protected $client;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected ProspectPhotoPathService $prospectPhotoPathService;
private SyncFieldAction $syncFieldAction;
private PayloadBuilder $payloadBuilder;
private SyncRelatedActivityManager $syncRelatedActivityManager;
private SyncArchivedProfilesAction $syncArchivedProfilesAction;
private WebhookSyncBatchProcessor $batchProcessor;
public function __construct(
Client $client,
SyncFieldAction $syncFieldAction,
PayloadBuilder $payloadBuilder,
ProspectPhotoPathService $prospectPhotoPathService,
SyncArchivedProfilesAction $syncArchivedProfilesAction,
WebhookSyncBatchProcessor $batchProcessor,
) {
parent::__construct();
$this->client = $client;
$this->syncFieldAction = $syncFieldAction;
$this->prospectPhotoPathService = $prospectPhotoPathService;
$this->payloadBuilder = $payloadBuilder;
$this->syncArchivedProfilesAction = $syncArchivedProfilesAction;
$this->batchProcessor = $batchProcessor;
$this->opportunitySyncStrategyResolver = app(OpportunitySyncStrategyResolver::class, [
'client' => $this->client,
]);
$this->syncRelatedActivityManager = app(SyncRelatedActivityManager::class, [
'client' => $this->client,
'payloadBuilder' => $this->payloadBuilder,
'logger' => $this->logger,
]);
$this->crmEntityRepository = app(CrmEntityRepository::class);
$this->dealFieldsService = app(DealFieldsService::class);
}
public function getDisplayName(): string
{
return 'HubSpot';
}
protected function getOAuthAccount(User $user): ?SocialAccount
{
// In this case, the Account Owner is always the connection for any API operations.
$owner = $user->team->owner;
return $owner->getSocialAccount(SocialAccount::PROVIDER_HUBSPOT);
}
public function getClient(): Client
{
/** @var Client */
return $this->client;
}
/**
* Convert raw field data into a format compatible with CRM APIs.
*
* @param bool $internal Direction of the conversion.
* True is pulling from CRM, false normalize before sending to CRM.
*/
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return ValueNormalizer::normalize(
fieldType: $fieldType,
fieldValue: $fieldValue,
isInbound: $internal,
);
}
/**
* @inheritdoc
*/
public function getDefaultFields(string $activityType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
$defaultFields = FieldDefinitions::defaultTaskFields();
// This lazy creates these fields if not already setup.
foreach ($defaultFields as $defaultField) {
$fields[] = $this->config->fields()->firstOrCreate($defaultField);
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function getDefaultActivityField(string $activityType): Field
{
/** @var Field $activityField */
$activityField = $this->config->fields()->where([
'crm_provider_id' => 'activityType',
'object_type' => $activityType,
])->first();
return $activityField;
}
/**
* @inheritdoc
*/
public function getSupportedPlaybookTypes(): array
{
return [Playbook::ACTIVITY_TYPE_TASK];
}
/**
* @inheritdoc
*/
public function getDefaultActivityLayoutFields(string $activityType, string $layoutType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
// Outcome should always be provided calls/meetings.
$fieldData = [
[
'crm_provider_id' => $layoutType === Layout::TYPE_SOFTPHONE_SUMMARY ? 'disposition' : 'meetingOutcome',
'object_type' => Field::OBJECT_TASK,
],
];
foreach ($fieldData as $data) {
$field = $this->config->fields()->where($data)->first();
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
}
return $fields;
}
public function getDealInsightsFields(): array
{
return FieldDefinitions::dealInsightsFields();
}
protected function getDefaultFollowupLayoutFields(string $activityType): array
{
$fields = [];
$fieldRepo = app(FieldRepository::class);
$fieldData = FieldDefinitions::followupFieldsFilter();
foreach ($fieldData as $data) {
$field = $fieldRepo->findOneConfigurationFieldByProperties($this->config, $data);
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function syncField(Field $field): void
{
switch ($field->object_type) {
case Field::OBJECT_ACCOUNT:
$crmField = $this->client->getInstance()->companyProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_CONTACT:
$crmField = $this->client->getInstance()->contactProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_OPPORTUNITY:
$crmField = $this->client->getInstance()->dealProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_TASK:
$this->syncSingleTaskField($field);
return;
default:
return;
}
$this->syncFieldAction->execute($field, $crmField->toArray());
}
/**
* @param array<array{
* id:string,
* label:string,
* value?:string
* }> $options
*
* @throws CrmException
*
* @return FieldData[]
*
*/
public function importPicklistValues(
Field $field,
array $options = [['id' => '', 'label' => '', 'value' => '']],
): array {
if (! empty($options[0]['id']) || ! empty($options[0]['value'])) {
// We already have the options, no need to fetch them again
return $this->importOptions($field, $options);
}
$options = [];
switch ($field->getObjectType()) {
case Field::OBJECT_ACCOUNT:
$options = $this->getClient()->fetchPropertyOptions('company', $field->getCrmProviderId());
break;
case Field::OBJECT_CONTACT:
$options = $this->getClient()->fetchPropertyOptions('contact', $field->getCrmProviderId());
break;
case Field::OBJECT_OPPORTUNITY:
// Hubspot has different endpoint for stages
$options = $this->getClient()->fetchOpportunityFieldOptions($field);
break;
case Field::OBJECT_TASK:
if ($field->getCrmProviderId() === 'disposition') {
$options = $this->getClient()->fetchDispositionFieldOptions();
} elseif (in_array($field->getCrmProviderId(), ['meetingOutcome', 'activityType'])) {
$options = $this->getClient()->fetchMeetingOutcomeFieldOptions($field);
}
break;
default:
$this->logger->warning('Invalid object type', [
'object_type' => $field->getObjectType(),
'field_id' => $field->getId(),
]);
throw new CrmException('Invalid object type');
}
return $this->importOptions($field, $options);
}
/**
* @inheritdoc
*/
public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage
{
$missingStage = null;
try {
// Use the HubSpot API client instead of the SDK crmPipelines() method
$endpoint = self::getDealsPipelinesEndpoint();
$pipelinesResponse = $this->client->getInstance()->getClient()->request('GET', $endpoint);
$pipelines = $pipelinesResponse->data->results;
} catch (RequestException|BadRequest $exception) {
throw $exception;
}
foreach ($pipelines as $pipeline) {
$stages = [];
// We create a business process to contain the pipeline, and store all stages against it.
$p = ResponseNormalize::normalizePipeline($pipeline);
// Create/update business process for this pipeline
$businessProcess = $this->config->businessProcesses()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'type' => BusinessProcess::TYPE_OPPORTUNITY,
'is_selectable' => $p['active'],
]);
// A record type is really a clone of the business process, used to store which record uses which pipeline.
// Create/update record type clone
$this->config->recordTypes()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'is_selectable' => $p['active'],
'business_process_id' => $businessProcess->id ?? null,
]);
// Stages - fetch all existing stages upfront to avoid N+1 queries
$existingStages = $this->config->stages()
->withTrashed()
->where('type', Stage::TYPE_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
foreach ($p['stages'] as $dealStage) {
$s = ResponseNormalize::normalizeDealStage($dealStage);
/** @var ?Stage $existingStage */
$existingStage = $existingStages->get($s['id']);
// Restore soft-deleted stages that are now active in HubSpot
if ($existingStage?->trashed() && $s['active']) {
$existingStage->restore();
}
// Upsert stage (updates soft-deleted records without restoring them)
$stage = $this->config->stages()->withTrashed()->updateOrCreate([
'crm_provider_id' => $s['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($s['label'], 0, 50),
'label' => mb_strimwidth($s['label'], 0, 191),
'type' => Stage::TYPE_OPPORTUNITY,
'sequence' => $s['displayOrder'],
'is_selectable' => $s['active'],
'probability' => $s['probability'] * 100,
]);
if ($missingStageName === $s['id']) {
$missingStage = $stage;
}
$stages[] = $stage->id;
}
$businessProcess->stages()->sync($stages);
}
return $missingStage;
}
/**
* @inheritdoc
*/
public function syncOrganization(): void
{
try {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function find(string $name, array $scopes): array
{
$count = $this->limit ?? 20;
$offset = $this->offset ?? 0;
/** @var array<int, array<string, mixed>> */
return Cache::remember(
key: $this->team->getId() . $name . $count . $offset,
ttl: 300,
callback: function () use ($name, $offset, $count): array {
$data = [];
// Use the new V3 API to find contacts based on additional fields.
foreach (['companies', 'contacts'] as $objectType) {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$ownerId = null;
if ($crmAccountId === null) {
return $data;
}
if ($userId) {
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
$ownerId = $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
$closedStages = $this->getClosedDealStages();
$payload = $this->payloadBuilder->generateOpportunitiesSearchPayload(
$this->config,
$crmAccountId,
$closedStages,
);
$results = $this->client->getPaginatedData($payload, 'deals');
foreach ($results['results'] as $object) {
$properties = $object['properties'];
$amount = null;
if (empty($properties['amount']) === false) {
$currency = $properties['deal_currency_code'] ?? $this->config->default_currency;
// Values can contain commas and any junk so strip them.
$value = (float) preg_replace('/[^\d.]/', '', $properties['amount']);
$amount = formatCurrency($value, $currency);
}
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
if ($businessProcess === null) {
// Import it.
$stage = $this->importStages([Stage::TYPE_OPPORTUNITY], $properties['dealstage']);
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
} else {
$stage = $businessProcess
->stages()
->where('crm_provider_id', $properties['dealstage'])
->where('type', Stage::TYPE_OPPORTUNITY)
->first();
if ($stage === null) {
// Import it.
$stage = $this->importStages(null, $properties['dealstage']);
}
}
$recordType = null;
if ($businessProcess) {
$recordType = $businessProcess->recordTypes()->first();
}
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$record = [
'crmId' => $object['id'],
'name' => $properties['dealname'] ?? 'Unknown Deal',
'value' => $amount,
'won' => $isWon,
'closed' => $isWon || $isLost,
'stage' => [
'id' => $stage?->getUuid() ?? '',
'name' => $stage?->getName() ?? '',
],
];
if ($recordType) {
$record += [
'recordType' => [
'id' => $recordType->id_string,
'name' => $recordType->name,
],
];
}
if ($ownerId && isset($properties['hubspot_owner_id']) && $properties['hubspot_owner_id'] === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
}
/**
* @inheritdoc
*/
public function getTasks(?string $objectType, string $objectId, ?string $opportunityId): array
{
$data = [];
switch ($objectType) {
case 'contact':
$hsObject = 'contact';
break;
case 'account':
$hsObject = 'company';
break;
default:
// This is a hack to prioritise and override a contact/company with a deal.
if ($opportunityId) {
$hsObject = 'deal';
$objectId = $opportunityId;
} else {
throw new InvalidArgumentException('Object type not supported.');
}
}
$engagementTypes = ['meetings', 'tasks'];
foreach ($engagementTypes as $engagementType) {
$payload = $this->payloadBuilder->getLinkToTaskPayload($hsObject, $objectId, $engagementType);
$this->logger->info('[HubSpot] CRM Search requested', [
'request' => $payload,
]);
$engagements = $this->client->getPaginatedData($payload, $engagementType);
foreach ($engagements['results'] as $engagement) {
if ($engagementType == 'meetings') {
$title = $engagement['properties']['hs_meeting_title'] ?? 'Scheduled meeting';
} elseif ($engagementType == 'tasks') {
$title = $engagement['properties']['hs_task_subject'];
} else {
$title = 'Scheduled meeting';
}
$data[] = [
'crmId' => $engagement['id'],
'subject' => $title,
'due' => $engagement['properties']['hs_timestamp'],
'type' => $engagement['properties']['hs_activity_type'] ?? null,
];
}
}
usort($data, function ($item1, $item2) {
return $item2['due'] <=> $item1['due'];
});
return $data;
}
/**
* Try to find CRM Objects using email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchExactlyByEmail(string $email, ?int $userId = null): ?array
{
$contactProperties = [
'email',
'firstname',
'lastname',
'country',
'phone',
'mobilephone',
'jobtitle',
'hubspot_owner_id',
'associatedcompanyid',
'photo',
];
$contact = null;
$account = null;
try {
$hsContact = $this->getClient()->getContactByEmail($email, $contactProperties);
if ($hsContact) {
$contact = $this->importContact($hsContact);
$account = $contact->account;
}
$data = $this->convertCrmData($contact, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
} catch (BadRequest $e) {
$this->logger->warning('[HubSpot] Search failed', [
'team_id' => $this->team->getId(),
'search_identifier' => $email,
'reason' => $e->getMessage(),
]);
}
return null;
}
public function getDomain(string $email): ?string
{
return $this->getDomainFromEmail($email);
}
/**
* Try to find CRM objects using domain name of the email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByDomain(string $domain, ?int $userId = null): ?array
{
$companyName = $domain;
// Try to find a company matching their email domain.
$companyProperties = [
'country',
'phone',
'name',
'hs_avatar_filemanager_key',
'industry',
'hubspot_owner_id',
'domain',
];
try {
$hsAccounts = $this->client
->getInstance()
->companies()
->searchByDomain($companyName, $companyProperties);
} catch (Throwable $e) {
$this->logger->info('[HubSpot] Search failed', [
'error' => $e->getMessage(),
'domain' => $domain,
]);
return null;
}
$account = null;
// If there are multiple accounts, don't guess, we'll ask later.
if (\count($hsAccounts->data->results) === 1) {
// Persist this remote object.
$account = $this->syncAccount($hsAccounts->data->results[0]->companyId);
}
$data = $this->convertCrmData(null, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
}
/**
* @return array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
protected function convertCrmData(?Contact $contact, ?Account $account, ?int $userId = null): array
{
$countryCode = null;
if ($contact && $contact->country_code) {
$countryCode = $contact->country_code;
} elseif ($account && $account->country_code) {
$countryCode = $account->country_code;
}
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact ? $contact->crm_provider_id : null,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
// If there are multiple opportunities, don't guess, we'll ask later.
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
protected function getCacheKey(string $object, ?int $userId = null): ?string
{
$key = $this->team->getId() . $object;
$keySuffix = $this->getOwnerKeySuffix($userId);
return $key . $keySuffix;
}
private function getOwnerKeySuffix(?int $userId = null): string
{
return $userId === null ? '' : (string) $userId;
}
/**
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
*}
*/
public function matchByPhone(string $phone, ?string $rawPhoneNumber = null, ?int $userId = null): ?array
{
if (str_contains($phone, '**')) {
return null;
}
// trim all whitespaces if present so the lookup doesn't fail
$phone = str_replace(' ', '', $phone);
// Check if the user is internal.
if ($this->isPhoneNumberOfTeamMember($phone)) {
return null;
}
$response = $this->searchForPhoneNumber($phone);
if (empty($response)) {
return null;
}
// This would ideally importContact instead but the response type differs.
$contact = $this->findAndSyncContact($response['results'][0]['id']);
if (! $contact instanceof Contact) {
return null;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account?->crm_provider_id,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
try {
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
} catch (Exception $e) {
$this->logger->debug('[HubSpot] Opportunity failed to sync.', [
'reason' => $e->getMessage(),
]);
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
private function isPhoneNumberOfTeamMember(string $phone): bool
{
$teamRepository = app(TeamRepository::class);
$user = $teamRepository->findTeamMemberByPhone($this->team, $phone);
if ($user instanceof User) {
return true;
}
return false;
}
private function findAndSyncContact(string $crmId): ?Contact
{
try {
return $this->syncContact($crmId);
} catch (Exception $exception) {
$this->logger->info('[HubSpot] Phone match failed', [
'reason' => $exception->getMessage(),
]);
return null;
}
}
private function hasResults(array $response): bool
{
return isset($response['total']) && is_numeric($response['total']) && $response['total'] > 0;
}
private function searchForPhoneNumber(string $phone): array
{
// Normalizes the provided phone number for the API search.
$normalizedPhone = $this->normalizePhoneNumber($phone);
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone);
$this->logger->info('[HubSpot] Phone match search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($normalizedPhone, $payload);
if (! $this->hasResults($response)) {
$nationalPhone = preg_replace('/\D/', '', phone_national(null, $phone));
$payload = $this->payloadBuilder->generatePhoneSearchPayload($nationalPhone);
$this->logger->info('[HubSpot] Phone match national number search triggered', [
'phone' => $phone,
'nationalPhone' => $nationalPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
if (! $this->hasResults($response)) {
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone, true);
$this->logger->info('[HubSpot] Phone match alternative search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
return $this->hasResults($response) ? $response : [];
}
private function handlePhoneSearchRequest(string $phone, array $payload): array
{
$endpoint = '[URL_WITH_CREDENTIALS] null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByName(string $name, ?int $userId = null): ?array
{
// Don't waste time searching for single character strings.
if (\strlen($name) <= 1) {
return null;
}
$cacheKey = $this->getCacheKey($name, $userId);
$result = Cache::remember($cacheKey, 60, function () use ($name, $userId) {
$payload = $this->payloadBuilder->generateSearchContactsByNamePayload(
$name,
$this->getContactFields()
);
$hsContacts = $this->client->getPaginatedData($payload, 'contact');
if (empty($hsContacts['results'])) {
return false;
}
$contact = $this->importContact($hsContacts['results'][0]);
if ($contact === null) {
return false;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
});
return is_array($result) ? $result : null;
}
private function convertActivityAssociations(Activity $activity): array
{
return [
'contactIds' => $this->getParticipantsIds($activity),
'companyIds' => $activity->hasAccount() ? [$activity->account->crm_provider_id] : [],
'dealIds' => $activity->hasOpportunity() ? [$activity->opportunity->crm_provider_id] : [],
'ownerIds' => [],
];
}
private function getParticipantsIds(Activity $activity): array
{
$attendees = [];
$participantRepository = app(ParticipantRepository::class);
$participants = $participantRepository->getParticipantsWhoEnteredMeeting($activity);
foreach ($participants as $participant) {
if ($participant->user_id || $participant->isCoach()) {
continue;
}
$contact = $participant->contact()->first();
if ($contact && $contact->crm_provider_id) {
$attendees[] = $contact->crm_provider_id;
} else {
if (! empty($participant->name)) {
$attendeeData = $this->fetchMissingAttendeeInfo($participant);
}
if (! empty($attendeeData['id'])) {
$attendees[] = $attendeeData['id'];
}
}
}
if ($activity->hasContact()) {
$attendees[] = $activity->contact->crm_provider_id;
}
return array_unique($attendees);
}
private function fetchMissingAttendeeInfo(Participant $participant): array
{
// Check if we need to look inside an account context.
$activity = $participant->getActivity();
$companyId = $activity->hasAccount() ? $activity->getAccount()->crm_provider_id : null;
// First check the local data.
/** @var Contact[] $contacts */
$contacts = $this->team->contacts()
->with('account')
->where('name', $participant->name)
->whereNotNull('email')
->get();
foreach ($contacts as $contact) {
// If we have a company in scope, check the contact is associated to it.
if (
$companyId !== null
&& ($contact->account_id === null || $companyId !== $contact->account->crm_provider_id)
) {
continue;
}
return [
'id' => $contact->crm_provider_id,
'email' => $contact->email,
];
}
$payload = $this->generateNameSearchPayload($participant->name, 0, 20);
try {
$response = $this->client->getNewInstance()->crm()->contacts()->searchApi()->doSearch($payload);
// TODO add some logic to choose the most suitable contact if multiple
foreach ($response['results'] as $object) {
$properties = $object['properties'];
if (empty($object['properties']) === false) {
// Check the company matches the contact.
// Todo: Move this check inside the API search.
if ($companyId !== null && $companyId !== $properties['associatedcompanyid']) {
continue;
}
return [
'id' => $object['id'],
'email' => $properties['email'],
];
}
}
} catch (Exception $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Search failed', [
'teamId' => $this->team->id_string,
'request' => $payload,
'reason' => $e->getMessage(),
]);
}
return [];
}
/**
* Store transcripts as note engagement.
*
* @throws Exception
*/
public function createTranscriptNotes(Activity $activity): void
{
// For HS no need to check if Crm profile - Log Notes field is enabled
// We only check if store_transcript toggle is enabled on crm profile.
$engagement = [
'active' => true,
'ownerId' => $this->profile->crm_provider_id,
'timestamp' => $activity->created_at->tz($activity->user->timezone)->getTimestamp() * 1000,
'type' => 'NOTE',
];
// Generate activity tr...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87284
|
|
87283
|
Project: faVsco.js, menu
rapstomViewCoocWindowFV f Project: faVsco.js, menu
rapstomViewCoocWindowFV faVsco.s ~#12121 on JY-20963-fx-inproideta RemotrmociccowanoResponseNormalize.phogsevice.on:esunchiorcdon.onGSUNCKOlOhCWWWKeweonooinlneochhoe>D IntearationAod>O Listeners>& Metadata>Da Pipedrivev SalestorceaFeldsa opoortunitvVatchenOpportunitySyncStrategy> ProspectsearchStrategyeSemicetiraitsC) e entondC Decorate ctimm cnoDeleteObiectsTrait.phpoead natioitionenno© PayloadBuilder.phpc) Profile.php© QueryBuilder.pho© QueryHandler.php© Queryiterator.phoo QueryRest condo Service.ond© SyncBatchRedisService.ptTraitelRasedlientond© BaseService.phpC CachedCrmServiceDecoratorconiooekesowod) CrmActivityProviderinteorateCCINVACMNMnonooweauiwostenee3eindsProscectinterace.ono3MatchDomsinsvamsinteraeC Ooportur vActvtwwatche3oportun tySyncStratsovintc @nportun tySyncStratcoyeec Prosoectenche.ondcOrnenontCostchCtttammDrnenontCostrhCtratomcntoei orawdoroo etr nhnCSamviceTesconrUmacurayscrict.onoheachmdeimserxoecordtor.onO ActMly pr123127 61128 6129 6130 6141© RecordSelector.phgOpportunitySyncTrait.php© CrmEntityRepository.phgprivate const string CALLS SEARCH ENDPOINT = hrtosaUanswhuhans..com/onm/y3/obriecte/ealle/seanch'aorivare const soring WYre Nolt = "wolz"1usaoeorivare const siring WYpe heaiins = "HeaN5usaoeorsvate const siein theg1 usageoesvare const sioind tpuines thrtoseanhuhantecon"/I NB: vi is legacy • vs 1s the newest1usagu• private const string ENDPOINT_PIPELINES = */crn-pipelines/v1/pipelines/*:1usogeprivate const string PIPELINE_OBJECT_TYPE_DEALS = 'deals' :1usogeprivate const int TASK VERIFICATION CACHETTL = 86488: 1 dav* Qvac ClientInterface Clientororcece deochroeeoo uecononsyncorrrcyko voh occonunownorrrcoykesorVehprotecred urnenta yRepostory Scra-nt tyreoost tony"protected ProspectPhotoPathService SprospectPhotoPathService:orivate Suncftel dact ion Ssyncatel daceton:orivate Pay oadsu der Soavloadbut der:orivate Sunckel atedact uirvlanacer Ssuncrelaredicoyrylanagen:onsvare svnc.nchsvedprosiles.crionNeunc.cchtmerproshles.cton"Auenotprivate WebhookSyncBatchProcessor SbatchProcessor:ouhise funeron constauerMkent SollentSyncFieldAction SsyncFieldAction,PayloadBuilder SpayloadBuilder,ProspectPhotoPathService $prospectPhotoPathServicetwttwew outteonaettodaw RayTO0У L7Thu 28 May 18:31:19ServiceTest+0.=custom.loglaravel.lodA SF jiminny@localhostHSJocal jiminny@blocalhostA console (PRODaswasforce/Service.oniA console (EU) X uin users (EU# console [STAGINGDe00tTc Autow169%178017811784-17117161728=17221723E1724172S172€1727172₴172917301731-173%-1733 v- 1739=1736= 1738PlaygroundOojiminnyORDER BY SMS COunT DESC031 49 A29 V 3 У 109 A 1SeLen ossNct usid, u,enat, u.name, u,ream sio, tunane as team namet.twilio_sns_sid, t.twilio_messaging_sidEROY usens uINNER JOIN teams t 1.n<->1: ON u.tean_id = t.1dWHERE (t.twilio_sns_sid IS NOT NULL OR t.twiLio_nessaging_sid IS NOT NULL)AND U.status = 1ORDER BY t.name, u.enail;SELECT * FROM teans WHERE nane LIKE "XTourhancx"; = 187, 209, 8150, salesforce-adnindt:CONCAT(u.id, CASE WHEN u.id = t.ownerid THEN " (ouner)' ELSE "* END) AS userid_sa.*t.owner id FROM social accounts saJOIN users u on u.id = sa.sociable idJOIN teams t 1.n<->1: on t.id = u.tean idWHERE v.team id = 187 and sa.provider = 'salesforce':select * from activitsles where 1d = 31264367.select * from contactswhere id = 6331639:select * from accounts nhere 1d = 4156632:select * from oppontunitiles where 1d = 4843618:# update 'activities" set 'account_id* = 4156632,conasosy O000run# 'stage 1d' = 13273)caotesuededms inoisoe troe mhonoselect * from text nelaus where created at > 12826-85-81°-select * fron actsivitsies onden by sid desciselect * fron usene nhere nane Like igSubrnke,SELECT * FROM onnontunities WHERE wnid.to_binf+04a9c6ad-2687-4453-9072-28aeb28ccf8d*)select * from teans where id = 555;select *rom stages where tean.iide S5ssCELECTCONCAT(u.id, CASE WHEN u.id = t.ounerid THEN • (onnen)• ELSE 11 ENO) AS ucon 3aaomaslsa.*t.ouner_id FROM social_accounts sainiM ncone nan wdeacosahloJOIN teams t 1.n<->1: on t.id = u.tean idWHERE U.team id = 100 and sa.provider = 'hubspot':Cascadeles Orcnnworeeoeionhnves dohtine OooondRitoootaNorenhooer.orobabuty" s Tloat (Coatal"cetadata""nrobabto tyteohThis s the root causeHere's the full explanation:Root eause: moorStaces overwntes DB orobabilty with Huospot's valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44 . The stage crm provider 1d: "closedtost" isHubSpot's standard "Closed Lost" stage which natively has probability ® in HubSpot.2. ImportStages() runs (during any pipeline/stage sync), It callsService.php:445-454Sstage = Sthis->config-ostages()-withTrashed()->update0rCreate(l"crm_provider_1d a 55l-10"JPbbtted3. sattorobabsTtu"1 comas from RestonscNorenKaer.roms WrebenlStaoe"orobability" a (4loat) (Saataf"retadata"|("orobabfWity'122 1.HubSpot returns netadata.probability = e for closedlost. So $s['probability") * 100 • 0. This resets stage 20616's probability back to 0 in tho4. Now getClosedDealStaces() outs "closedlost" into lostll (orobability 0), not woni5. The deal syncs → is_von = false, is_closed = truetha connonss of muonte.May 4After May 4Stace 20616 probability manually changed to 100 in Jiminny DAmortStanes () runr → resetr staae 20616 probability back to 0 (frem HubSpot)May 20Dral synos → *closedlost» is in lostll (orob=0) = ts won = falarThe opportunitye atane ta in etill 20616 (the stage reeord ID never changed), but by the time it suncad on May 20, iroortStages had already resct theprobability of that stage back to 0. So when bui ldOpportunityData runs, "closedlost" is in lost(I, not von!!The core issue: inportStages always overwrites the DB probability with whatever HubSpot says. Any manual probability customisation in Jiminny getswiped out the next time stages are synoed from HubSpot. Stage 20616 was manually set to 100 but the label says *7. Won (Contract Signed)" while thiHibSoot em omuider da le cloadilost = HibSootte nativa orobability for that is Ouso ft cate racatGuntaAt anthientua$ AdhotsWoderd Tesms 119:28 UTE-R A/Aenod...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87283
|
|
87282
|
IAlSlackFileEditViewGoHistoryWindowActivity Monito IAlSlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskscreenpipereplaydWindowServerlanguage_server_macos_armlaunchservicesdcef_server Helper (Renderer)Notion Helper (Renderer)FirefoxCP Isolated Web ContentcoreaudiodFirefoxActivity MonitorlaunchdSlackbluetoothdFirefoxCP Isolated Web Contentcef_serverClaudeFirefoxCP Isolated Web ContentWispr FlowiTerm2FirefoxCP Isolated Web ContentSlack Helper (Renderer)Wispr Flow Helper (Renderer)Postman Helper (Renderer)Wispr Flowcef_server Helper (GPU)251,3181,090,758,139,319,014,512,311,710,86,84,94,44,44,03,73,52,82,72,62,21,91,71,61,61,51,41,4HelpCPU Time4:22:27,6224:07:23,303:50:53,716:41:02,648:07:25,1012:05,421:04:27,209:40,9025:17,6041:11,261:01:55,351:50:00,469:33,9319:36,8914:06,1621:07,4459,294:21,6629:42,8117:01,074:25,311:05:02,1143:55,181:00:46,285:43,987:02,141:39,738:26,97System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+46,77%53,00%0,23%CPUED→Jiminny...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana NetsevaEo Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko Kashinski. Galya Dimitrova: Todor Stamatov. Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:20Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87282
|
|
87281
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
149
1
33
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm\Hubspot;
use Carbon\Carbon;
use Exception;
use Generator;
use GuzzleHttp\Exception\RequestException;
use HubSpot\Client\Crm\Owners\Model\PublicOwner;
use Illuminate\Support\Facades\Cache;
use InvalidArgumentException;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SavePlaybackLinkToCrmInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Contracts\Services\Crm\VerifyTaskExistsInterface;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Participant;
use Jiminny\Models\Playbook;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\ParticipantRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\Hubspot\Actions\SyncArchivedProfilesAction;
use Jiminny\Services\Crm\Hubspot\Fields\ValueNormalizer;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\OpportunitySyncTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncFieldsTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\WriteCrmTrait;
use Jiminny\Services\Crm\MatchDomainByEmailInterface;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Services\Crm\ResolveCompanyNameByEmailTrait;
use Jiminny\Utils\PlaybackUrlBuilder;
use Sentry;
use SevenShores\Hubspot\Exceptions\BadRequest;
use Throwable;
use UnexpectedValueException;
/**
* @phpstan-type CrmFieldDefinition array{
* name: string,
* label: string,
* description: string,
* type: string,
* fieldType: string,
* hidden: bool,
* showCurrencySymbol: bool,
* options: array<array{
* id: string,
* label: string,
* value?: string,
* }
*/
class Service extends BaseService implements
HubspotInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
SendSummaryToCrmInterface,
MatchDomainByEmailInterface,
SavePlaybackLinkToCrmInterface,
RemoteEntityManipulationInterface,
FetchRelatedActivityInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
VerifyTaskExistsInterface
{
use ResolveCompanyNameByEmailTrait;
use SyncCrmEntitiesTrait;
use WriteCrmTrait;
use SyncFieldsTrait;
use OpportunitySyncTrait;
private const int ENGAGEMENT_BODY_MAX_LENGTH = 65536;
private const string LOG_DATE_FORMAT = 'Y-m-d H:i:s';
private const int BATCH_UPDATE_LIMIT = 100;
private const string TEN_SECONDLY_ROLLING_POLICY = 'TEN_SECONDLY_ROLLING';
private const int TEN_SECONDLY_ROLLING_LIMIT = 10;
private const string CALLS_SEARCH_ENDPOINT = '[URL_WITH_CREDENTIALS] ClientInterface|Client
*/
protected $client;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected ProspectPhotoPathService $prospectPhotoPathService;
private SyncFieldAction $syncFieldAction;
private PayloadBuilder $payloadBuilder;
private SyncRelatedActivityManager $syncRelatedActivityManager;
private SyncArchivedProfilesAction $syncArchivedProfilesAction;
private WebhookSyncBatchProcessor $batchProcessor;
public function __construct(
Client $client,
SyncFieldAction $syncFieldAction,
PayloadBuilder $payloadBuilder,
ProspectPhotoPathService $prospectPhotoPathService,
SyncArchivedProfilesAction $syncArchivedProfilesAction,
WebhookSyncBatchProcessor $batchProcessor,
) {
parent::__construct();
$this->client = $client;
$this->syncFieldAction = $syncFieldAction;
$this->prospectPhotoPathService = $prospectPhotoPathService;
$this->payloadBuilder = $payloadBuilder;
$this->syncArchivedProfilesAction = $syncArchivedProfilesAction;
$this->batchProcessor = $batchProcessor;
$this->opportunitySyncStrategyResolver = app(OpportunitySyncStrategyResolver::class, [
'client' => $this->client,
]);
$this->syncRelatedActivityManager = app(SyncRelatedActivityManager::class, [
'client' => $this->client,
'payloadBuilder' => $this->payloadBuilder,
'logger' => $this->logger,
]);
$this->crmEntityRepository = app(CrmEntityRepository::class);
$this->dealFieldsService = app(DealFieldsService::class);
}
public function getDisplayName(): string
{
return 'HubSpot';
}
protected function getOAuthAccount(User $user): ?SocialAccount
{
// In this case, the Account Owner is always the connection for any API operations.
$owner = $user->team->owner;
return $owner->getSocialAccount(SocialAccount::PROVIDER_HUBSPOT);
}
public function getClient(): Client
{
/** @var Client */
return $this->client;
}
/**
* Convert raw field data into a format compatible with CRM APIs.
*
* @param bool $internal Direction of the conversion.
* True is pulling from CRM, false normalize before sending to CRM.
*/
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return ValueNormalizer::normalize(
fieldType: $fieldType,
fieldValue: $fieldValue,
isInbound: $internal,
);
}
/**
* @inheritdoc
*/
public function getDefaultFields(string $activityType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
$defaultFields = FieldDefinitions::defaultTaskFields();
// This lazy creates these fields if not already setup.
foreach ($defaultFields as $defaultField) {
$fields[] = $this->config->fields()->firstOrCreate($defaultField);
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function getDefaultActivityField(string $activityType): Field
{
/** @var Field $activityField */
$activityField = $this->config->fields()->where([
'crm_provider_id' => 'activityType',
'object_type' => $activityType,
])->first();
return $activityField;
}
/**
* @inheritdoc
*/
public function getSupportedPlaybookTypes(): array
{
return [Playbook::ACTIVITY_TYPE_TASK];
}
/**
* @inheritdoc
*/
public function getDefaultActivityLayoutFields(string $activityType, string $layoutType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
// Outcome should always be provided calls/meetings.
$fieldData = [
[
'crm_provider_id' => $layoutType === Layout::TYPE_SOFTPHONE_SUMMARY ? 'disposition' : 'meetingOutcome',
'object_type' => Field::OBJECT_TASK,
],
];
foreach ($fieldData as $data) {
$field = $this->config->fields()->where($data)->first();
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
}
return $fields;
}
public function getDealInsightsFields(): array
{
return FieldDefinitions::dealInsightsFields();
}
protected function getDefaultFollowupLayoutFields(string $activityType): array
{
$fields = [];
$fieldRepo = app(FieldRepository::class);
$fieldData = FieldDefinitions::followupFieldsFilter();
foreach ($fieldData as $data) {
$field = $fieldRepo->findOneConfigurationFieldByProperties($this->config, $data);
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function syncField(Field $field): void
{
switch ($field->object_type) {
case Field::OBJECT_ACCOUNT:
$crmField = $this->client->getInstance()->companyProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_CONTACT:
$crmField = $this->client->getInstance()->contactProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_OPPORTUNITY:
$crmField = $this->client->getInstance()->dealProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_TASK:
$this->syncSingleTaskField($field);
return;
default:
return;
}
$this->syncFieldAction->execute($field, $crmField->toArray());
}
/**
* @param array<array{
* id:string,
* label:string,
* value?:string
* }> $options
*
* @throws CrmException
*
* @return FieldData[]
*
*/
public function importPicklistValues(
Field $field,
array $options = [['id' => '', 'label' => '', 'value' => '']],
): array {
if (! empty($options[0]['id']) || ! empty($options[0]['value'])) {
// We already have the options, no need to fetch them again
return $this->importOptions($field, $options);
}
$options = [];
switch ($field->getObjectType()) {
case Field::OBJECT_ACCOUNT:
$options = $this->getClient()->fetchPropertyOptions('company', $field->getCrmProviderId());
break;
case Field::OBJECT_CONTACT:
$options = $this->getClient()->fetchPropertyOptions('contact', $field->getCrmProviderId());
break;
case Field::OBJECT_OPPORTUNITY:
// Hubspot has different endpoint for stages
$options = $this->getClient()->fetchOpportunityFieldOptions($field);
break;
case Field::OBJECT_TASK:
if ($field->getCrmProviderId() === 'disposition') {
$options = $this->getClient()->fetchDispositionFieldOptions();
} elseif (in_array($field->getCrmProviderId(), ['meetingOutcome', 'activityType'])) {
$options = $this->getClient()->fetchMeetingOutcomeFieldOptions($field);
}
break;
default:
$this->logger->warning('Invalid object type', [
'object_type' => $field->getObjectType(),
'field_id' => $field->getId(),
]);
throw new CrmException('Invalid object type');
}
return $this->importOptions($field, $options);
}
/**
* @inheritdoc
*/
public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage
{
$missingStage = null;
try {
// Use the HubSpot API client instead of the SDK crmPipelines() method
$endpoint = self::getDealsPipelinesEndpoint();
$pipelinesResponse = $this->client->getInstance()->getClient()->request('GET', $endpoint);
$pipelines = $pipelinesResponse->data->results;
} catch (RequestException|BadRequest $exception) {
throw $exception;
}
foreach ($pipelines as $pipeline) {
$stages = [];
// We create a business process to contain the pipeline, and store all stages against it.
$p = ResponseNormalize::normalizePipeline($pipeline);
// Create/update business process for this pipeline
$businessProcess = $this->config->businessProcesses()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'type' => BusinessProcess::TYPE_OPPORTUNITY,
'is_selectable' => $p['active'],
]);
// A record type is really a clone of the business process, used to store which record uses which pipeline.
// Create/update record type clone
$this->config->recordTypes()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'is_selectable' => $p['active'],
'business_process_id' => $businessProcess->id ?? null,
]);
// Stages - fetch all existing stages upfront to avoid N+1 queries
$existingStages = $this->config->stages()
->withTrashed()
->where('type', Stage::TYPE_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
foreach ($p['stages'] as $dealStage) {
$s = ResponseNormalize::normalizeDealStage($dealStage);
/** @var ?Stage $existingStage */
$existingStage = $existingStages->get($s['id']);
// Restore soft-deleted stages that are now active in HubSpot
if ($existingStage?->trashed() && $s['active']) {
$existingStage->restore();
}
// Upsert stage (updates soft-deleted records without restoring them)
$stage = $this->config->stages()->withTrashed()->updateOrCreate([
'crm_provider_id' => $s['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($s['label'], 0, 50),
'label' => mb_strimwidth($s['label'], 0, 191),
'type' => Stage::TYPE_OPPORTUNITY,
'sequence' => $s['displayOrder'],
'is_selectable' => $s['active'],
'probability' => $s['probability'] * 100,
]);
if ($missingStageName === $s['id']) {
$missingStage = $stage;
}
$stages[] = $stage->id;
}
$businessProcess->stages()->sync($stages);
}
return $missingStage;
}
/**
* @inheritdoc
*/
public function syncOrganization(): void
{
try {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function find(string $name, array $scopes): array
{
$count = $this->limit ?? 20;
$offset = $this->offset ?? 0;
/** @var array<int, array<string, mixed>> */
return Cache::remember(
key: $this->team->getId() . $name . $count . $offset,
ttl: 300,
callback: function () use ($name, $offset, $count): array {
$data = [];
// Use the new V3 API to find contacts based on additional fields.
foreach (['companies', 'contacts'] as $objectType) {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$ownerId = null;
if ($crmAccountId === null) {
return $data;
}
if ($userId) {
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
$ownerId = $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
$closedStages = $this->getClosedDealStages();
$payload = $this->payloadBuilder->generateOpportunitiesSearchPayload(
$this->config,
$crmAccountId,
$closedStages,
);
$results = $this->client->getPaginatedData($payload, 'deals');
foreach ($results['results'] as $object) {
$properties = $object['properties'];
$amount = null;
if (empty($properties['amount']) === false) {
$currency = $properties['deal_currency_code'] ?? $this->config->default_currency;
// Values can contain commas and any junk so strip them.
$value = (float) preg_replace('/[^\d.]/', '', $properties['amount']);
$amount = formatCurrency($value, $currency);
}
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
if ($businessProcess === null) {
// Import it.
$stage = $this->importStages([Stage::TYPE_OPPORTUNITY], $properties['dealstage']);
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
} else {
$stage = $businessProcess
->stages()
->where('crm_provider_id', $properties['dealstage'])
->where('type', Stage::TYPE_OPPORTUNITY)
->first();
if ($stage === null) {
// Import it.
$stage = $this->importStages(null, $properties['dealstage']);
}
}
$recordType = null;
if ($businessProcess) {
$recordType = $businessProcess->recordTypes()->first();
}
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$record = [
'crmId' => $object['id'],
'name' => $properties['dealname'] ?? 'Unknown Deal',
'value' => $amount,
'won' => $isWon,
'closed' => $isWon || $isLost,
'stage' => [
'id' => $stage?->getUuid() ?? '',
'name' => $stage?->getName() ?? '',
],
];
if ($recordType) {
$record += [
'recordType' => [
'id' => $recordType->id_string,
'name' => $recordType->name,
],
];
}
if ($ownerId && isset($properties['hubspot_owner_id']) && $properties['hubspot_owner_id'] === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
}
/**
* @inheritdoc
*/
public function getTasks(?string $objectType, string $objectId, ?string $opportunityId): array
{
$data = [];
switch ($objectType) {
case 'contact':
$hsObject = 'contact';
break;
case 'account':
$hsObject = 'company';
break;
default:
// This is a hack to prioritise and override a contact/company with a deal.
if ($opportunityId) {
$hsObject = 'deal';
$objectId = $opportunityId;
} else {
throw new InvalidArgumentException('Object type not supported.');
}
}
$engagementTypes = ['meetings', 'tasks'];
foreach ($engagementTypes as $engagementType) {
$payload = $this->payloadBuilder->getLinkToTaskPayload($hsObject, $objectId, $engagementType);
$this->logger->info('[HubSpot] CRM Search requested', [
'request' => $payload,
]);
$engagements = $this->client->getPaginatedData($payload, $engagementType);
foreach ($engagements['results'] as $engagement) {
if ($engagementType == 'meetings') {
$title = $engagement['properties']['hs_meeting_title'] ?? 'Scheduled meeting';
} elseif ($engagementType == 'tasks') {
$title = $engagement['properties']['hs_task_subject'];
} else {
$title = 'Scheduled meeting';
}
$data[] = [
'crmId' => $engagement['id'],
'subject' => $title,
'due' => $engagement['properties']['hs_timestamp'],
'type' => $engagement['properties']['hs_activity_type'] ?? null,
];
}
}
usort($data, function ($item1, $item2) {
return $item2['due'] <=> $item1['due'];
});
return $data;
}
/**
* Try to find CRM Objects using email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchExactlyByEmail(string $email, ?int $userId = null): ?array
{
$contactProperties = [
'email',
'firstname',
'lastname',
'country',
'phone',
'mobilephone',
'jobtitle',
'hubspot_owner_id',
'associatedcompanyid',
'photo',
];
$contact = null;
$account = null;
try {
$hsContact = $this->getClient()->getContactByEmail($email, $contactProperties);
if ($hsContact) {
$contact = $this->importContact($hsContact);
$account = $contact->account;
}
$data = $this->convertCrmData($contact, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
} catch (BadRequest $e) {
$this->logger->warning('[HubSpot] Search failed', [
'team_id' => $this->team->getId(),
'search_identifier' => $email,
'reason' => $e->getMessage(),
]);
}
return null;
}
public function getDomain(string $email): ?string
{
return $this->getDomainFromEmail($email);
}
/**
* Try to find CRM objects using domain name of the email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByDomain(string $domain, ?int $userId = null): ?array
{
$companyName = $domain;
// Try to find a company matching their email domain.
$companyProperties = [
'country',
'phone',
'name',
'hs_avatar_filemanager_key',
'industry',
'hubspot_owner_id',
'domain',
];
try {
$hsAccounts = $this->client
->getInstance()
->companies()
->searchByDomain($companyName, $companyProperties);
} catch (Throwable $e) {
$this->logger->info('[HubSpot] Search failed', [
'error' => $e->getMessage(),
'domain' => $domain,
]);
return null;
}
$account = null;
// If there are multiple accounts, don't guess, we'll ask later.
if (\count($hsAccounts->data->results) === 1) {
// Persist this remote object.
$account = $this->syncAccount($hsAccounts->data->results[0]->companyId);
}
$data = $this->convertCrmData(null, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
}
/**
* @return array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
protected function convertCrmData(?Contact $contact, ?Account $account, ?int $userId = null): array
{
$countryCode = null;
if ($contact && $contact->country_code) {
$countryCode = $contact->country_code;
} elseif ($account && $account->country_code) {
$countryCode = $account->country_code;
}
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact ? $contact->crm_provider_id : null,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
// If there are multiple opportunities, don't guess, we'll ask later.
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
protected function getCacheKey(string $object, ?int $userId = null): ?string
{
$key = $this->team->getId() . $object;
$keySuffix = $this->getOwnerKeySuffix($userId);
return $key . $keySuffix;
}
private function getOwnerKeySuffix(?int $userId = null): string
{
return $userId === null ? '' : (string) $userId;
}
/**
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
*}
*/
public function matchByPhone(string $phone, ?string $rawPhoneNumber = null, ?int $userId = null): ?array
{
if (str_contains($phone, '**')) {
return null;
}
// trim all whitespaces if present so the lookup doesn't fail
$phone = str_replace(' ', '', $phone);
// Check if the user is internal.
if ($this->isPhoneNumberOfTeamMember($phone)) {
return null;
}
$response = $this->searchForPhoneNumber($phone);
if (empty($response)) {
return null;
}
// This would ideally importContact instead but the response type differs.
$contact = $this->findAndSyncContact($response['results'][0]['id']);
if (! $contact instanceof Contact) {
return null;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account?->crm_provider_id,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
try {
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
} catch (Exception $e) {
$this->logger->debug('[HubSpot] Opportunity failed to sync.', [
'reason' => $e->getMessage(),
]);
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
private function isPhoneNumberOfTeamMember(string $phone): bool
{
$teamRepository = app(TeamRepository::class);
$user = $teamRepository->findTeamMemberByPhone($this->team, $phone);
if ($user instanceof User) {
return true;
}
return false;
}
private function findAndSyncContact(string $crmId): ?Contact
{
try {
return $this->syncContact($crmId);
} catch (Exception $exception) {
$this->logger->info('[HubSpot] Phone match failed', [
'reason' => $exception->getMessage(),
]);
return null;
}
}
private function hasResults(array $response): bool
{
return isset($response['total']) && is_numeric($response['total']) && $response['total'] > 0;
}
private function searchForPhoneNumber(string $phone): array
{
// Normalizes the provided phone number for the API search.
$normalizedPhone = $this->normalizePhoneNumber($phone);
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone);
$this->logger->info('[HubSpot] Phone match search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($normalizedPhone, $payload);
if (! $this->hasResults($response)) {
$nationalPhone = preg_replace('/\D/', '', phone_national(null, $phone));
$payload = $this->payloadBuilder->generatePhoneSearchPayload($nationalPhone);
$this->logger->info('[HubSpot] Phone match national number search triggered', [
'phone' => $phone,
'nationalPhone' => $nationalPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
if (! $this->hasResults($response)) {
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone, true);
$this->logger->info('[HubSpot] Phone match alternative search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
return $this->hasResults($response) ? $response : [];
}
private function handlePhoneSearchRequest(string $phone, array $payload): array
{
$endpoint = '[URL_WITH_CREDENTIALS] null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByName(string $name, ?int $userId = null): ?array
{
// Don't waste time searching for single character strings.
if (\strlen($name) <= 1) {
return null;
}
$cacheKey = $this->getCacheKey($name, $userId);
$result = Cache::remember($cacheKey, 60, function () use ($name, $userId) {
$payload = $this->payloadBuilder->generateSearchContactsByNamePayload(
$name,
$this->getContactFields()
);
$hsContacts = $this->client->getPaginatedData($payload, 'contact');
if (empty($hsContacts['results'])) {
return false;
}
$contact = $this->importContact($hsContacts['results'][0]);
if ($contact === null) {
return false;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
});
return is_array($result) ? $result : null;
}
private function convertActivityAssociations(Activity $activity): array
{
return [
'contactIds' => $this->getParticipantsIds($activity),
'companyIds' => $activity->hasAccount() ? [$activity->account->crm_provider_id] : [],
'dealIds' => $activity->hasOpportunity() ? [$activity->opportunity->crm_provider_id] : [],
'ownerIds' => [],
];
}
private function getParticipantsIds(Activity $activity): array
{
$attendees = [];
$participantRepository = app(ParticipantRepository::class);
$participants = $participantRepository->getParticipantsWhoEnteredMeeting($activity);
foreach ($participants as $participant) {
if ($participant->user_id || $participant->isCoach()) {
continue;
}
$contact = $participant->contact()->first();
if ($contact && $contact->crm_provider_id) {
$attendees[] = $contact->crm_provider_id;
} else {
if (! empty($participant->name)) {
$attendeeData = $this->fetchMissingAttendeeInfo($participant);
}
if (! empty($attendeeData['id'])) {
$attendees[] = $attendeeData['id'];
}
}
}
if ($activity->hasContact()) {
$attendees[] = $activity->contact->crm_provider_id;
}
return array_unique($attendees);
}
private function fetchMissingAttendeeInfo(Participant $participant): array
{
// Check if we need to look inside an account context.
$activity = $participant->getActivity();
$companyId = $activity->hasAccount() ? $activity->getAccount()->crm_provider_id : null;
// First check the local data.
/** @var Contact[] $contacts */
$contacts = $this->team->contacts()
->with('account')
->where('name', $participant->name)
->whereNotNull('email')
->get();
foreach ($contacts as $contact) {
// If we have a company in scope, check the contact is associated to it.
if (
$companyId !== null
&& ($contact->account_id === null || $companyId !== $contact->account->crm_provider_id)
) {
continue;
}
return [
'id' => $contact->crm_provider_id,
'email' => $contact->email,
];
}
$payload = $this->generateNameSearchPayload($participant->name, 0, 20);
try {
$response = $this->client->getNewInstance()->crm()->contacts()->searchApi()->doSearch($payload);
// TODO add some logic to choose the most suitable contact if multiple
foreach ($response['results'] as $object) {
$properties = $object['properties'];
if (empty($object['properties']) === false) {
// Check the company matches the contact.
// Todo: Move this check inside the API search.
if ($companyId !== null && $companyId !== $properties['associatedcompanyid']) {
continue;
}
return [
'id' => $object['id'],
'email' => $properties['email'],
];
}
}
} catch (Exception $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Search failed', [
'teamId' => $this->team->id_string,
'request' => $payload,
'reason' => $e->getMessage(),
]);
}
return [];
}
/**
* Store transcripts as note engagement.
*
* @throws Exception
*/
public function createTranscriptNotes(Activity $activity): void
{
// For HS no need to check if Crm profile - Log Notes field is enabled
// We only check if store_transcript toggle is enabled on crm profile.
$engagement = [
'active' => true,
'ownerId' => $this->profile->crm_provider_id,
'timestamp' => $activity->created_at->tz($activity->user->timezone)->getTimestamp() * 1000,
'type' => 'NOTE',
];
// Generate activity tr...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87281
|
|
87280
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
149
1
33
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm\Hubspot;
use Carbon\Carbon;
use Exception;
use Generator;
use GuzzleHttp\Exception\RequestException;
use HubSpot\Client\Crm\Owners\Model\PublicOwner;
use Illuminate\Support\Facades\Cache;
use InvalidArgumentException;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SavePlaybackLinkToCrmInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Contracts\Services\Crm\VerifyTaskExistsInterface;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contact;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Participant;
use Jiminny\Models\Playbook;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\ParticipantRepository;
use Jiminny\Services\Avatar\ProspectPhotoPathService;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\Hubspot\Actions\SyncArchivedProfilesAction;
use Jiminny\Services\Crm\Hubspot\Fields\ValueNormalizer;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\OpportunitySyncTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\SyncFieldsTrait;
use Jiminny\Services\Crm\Hubspot\ServiceTraits\WriteCrmTrait;
use Jiminny\Services\Crm\MatchDomainByEmailInterface;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Services\Crm\ResolveCompanyNameByEmailTrait;
use Jiminny\Utils\PlaybackUrlBuilder;
use Sentry;
use SevenShores\Hubspot\Exceptions\BadRequest;
use Throwable;
use UnexpectedValueException;
/**
* @phpstan-type CrmFieldDefinition array{
* name: string,
* label: string,
* description: string,
* type: string,
* fieldType: string,
* hidden: bool,
* showCurrencySymbol: bool,
* options: array<array{
* id: string,
* label: string,
* value?: string,
* }
*/
class Service extends BaseService implements
HubspotInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
SendSummaryToCrmInterface,
MatchDomainByEmailInterface,
SavePlaybackLinkToCrmInterface,
RemoteEntityManipulationInterface,
FetchRelatedActivityInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
VerifyTaskExistsInterface
{
use ResolveCompanyNameByEmailTrait;
use SyncCrmEntitiesTrait;
use WriteCrmTrait;
use SyncFieldsTrait;
use OpportunitySyncTrait;
private const int ENGAGEMENT_BODY_MAX_LENGTH = 65536;
private const string LOG_DATE_FORMAT = 'Y-m-d H:i:s';
private const int BATCH_UPDATE_LIMIT = 100;
private const string TEN_SECONDLY_ROLLING_POLICY = 'TEN_SECONDLY_ROLLING';
private const int TEN_SECONDLY_ROLLING_LIMIT = 10;
private const string CALLS_SEARCH_ENDPOINT = '[URL_WITH_CREDENTIALS] ClientInterface|Client
*/
protected $client;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected ProspectPhotoPathService $prospectPhotoPathService;
private SyncFieldAction $syncFieldAction;
private PayloadBuilder $payloadBuilder;
private SyncRelatedActivityManager $syncRelatedActivityManager;
private SyncArchivedProfilesAction $syncArchivedProfilesAction;
private WebhookSyncBatchProcessor $batchProcessor;
public function __construct(
Client $client,
SyncFieldAction $syncFieldAction,
PayloadBuilder $payloadBuilder,
ProspectPhotoPathService $prospectPhotoPathService,
SyncArchivedProfilesAction $syncArchivedProfilesAction,
WebhookSyncBatchProcessor $batchProcessor,
) {
parent::__construct();
$this->client = $client;
$this->syncFieldAction = $syncFieldAction;
$this->prospectPhotoPathService = $prospectPhotoPathService;
$this->payloadBuilder = $payloadBuilder;
$this->syncArchivedProfilesAction = $syncArchivedProfilesAction;
$this->batchProcessor = $batchProcessor;
$this->opportunitySyncStrategyResolver = app(OpportunitySyncStrategyResolver::class, [
'client' => $this->client,
]);
$this->syncRelatedActivityManager = app(SyncRelatedActivityManager::class, [
'client' => $this->client,
'payloadBuilder' => $this->payloadBuilder,
'logger' => $this->logger,
]);
$this->crmEntityRepository = app(CrmEntityRepository::class);
$this->dealFieldsService = app(DealFieldsService::class);
}
public function getDisplayName(): string
{
return 'HubSpot';
}
protected function getOAuthAccount(User $user): ?SocialAccount
{
// In this case, the Account Owner is always the connection for any API operations.
$owner = $user->team->owner;
return $owner->getSocialAccount(SocialAccount::PROVIDER_HUBSPOT);
}
public function getClient(): Client
{
/** @var Client */
return $this->client;
}
/**
* Convert raw field data into a format compatible with CRM APIs.
*
* @param bool $internal Direction of the conversion.
* True is pulling from CRM, false normalize before sending to CRM.
*/
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return ValueNormalizer::normalize(
fieldType: $fieldType,
fieldValue: $fieldValue,
isInbound: $internal,
);
}
/**
* @inheritdoc
*/
public function getDefaultFields(string $activityType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
$defaultFields = FieldDefinitions::defaultTaskFields();
// This lazy creates these fields if not already setup.
foreach ($defaultFields as $defaultField) {
$fields[] = $this->config->fields()->firstOrCreate($defaultField);
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function getDefaultActivityField(string $activityType): Field
{
/** @var Field $activityField */
$activityField = $this->config->fields()->where([
'crm_provider_id' => 'activityType',
'object_type' => $activityType,
])->first();
return $activityField;
}
/**
* @inheritdoc
*/
public function getSupportedPlaybookTypes(): array
{
return [Playbook::ACTIVITY_TYPE_TASK];
}
/**
* @inheritdoc
*/
public function getDefaultActivityLayoutFields(string $activityType, string $layoutType): array
{
$fields = [];
if ($activityType === Playbook::ACTIVITY_TYPE_TASK) {
// Outcome should always be provided calls/meetings.
$fieldData = [
[
'crm_provider_id' => $layoutType === Layout::TYPE_SOFTPHONE_SUMMARY ? 'disposition' : 'meetingOutcome',
'object_type' => Field::OBJECT_TASK,
],
];
foreach ($fieldData as $data) {
$field = $this->config->fields()->where($data)->first();
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
}
return $fields;
}
public function getDealInsightsFields(): array
{
return FieldDefinitions::dealInsightsFields();
}
protected function getDefaultFollowupLayoutFields(string $activityType): array
{
$fields = [];
$fieldRepo = app(FieldRepository::class);
$fieldData = FieldDefinitions::followupFieldsFilter();
foreach ($fieldData as $data) {
$field = $fieldRepo->findOneConfigurationFieldByProperties($this->config, $data);
// Only add the field if it is created, which it should be.
if ($field) {
$fields[] = $field;
}
}
return $fields;
}
/**
* @inheritdoc
*/
public function syncField(Field $field): void
{
switch ($field->object_type) {
case Field::OBJECT_ACCOUNT:
$crmField = $this->client->getInstance()->companyProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_CONTACT:
$crmField = $this->client->getInstance()->contactProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_OPPORTUNITY:
$crmField = $this->client->getInstance()->dealProperties()->get($field->crm_provider_id);
break;
case Field::OBJECT_TASK:
$this->syncSingleTaskField($field);
return;
default:
return;
}
$this->syncFieldAction->execute($field, $crmField->toArray());
}
/**
* @param array<array{
* id:string,
* label:string,
* value?:string
* }> $options
*
* @throws CrmException
*
* @return FieldData[]
*
*/
public function importPicklistValues(
Field $field,
array $options = [['id' => '', 'label' => '', 'value' => '']],
): array {
if (! empty($options[0]['id']) || ! empty($options[0]['value'])) {
// We already have the options, no need to fetch them again
return $this->importOptions($field, $options);
}
$options = [];
switch ($field->getObjectType()) {
case Field::OBJECT_ACCOUNT:
$options = $this->getClient()->fetchPropertyOptions('company', $field->getCrmProviderId());
break;
case Field::OBJECT_CONTACT:
$options = $this->getClient()->fetchPropertyOptions('contact', $field->getCrmProviderId());
break;
case Field::OBJECT_OPPORTUNITY:
// Hubspot has different endpoint for stages
$options = $this->getClient()->fetchOpportunityFieldOptions($field);
break;
case Field::OBJECT_TASK:
if ($field->getCrmProviderId() === 'disposition') {
$options = $this->getClient()->fetchDispositionFieldOptions();
} elseif (in_array($field->getCrmProviderId(), ['meetingOutcome', 'activityType'])) {
$options = $this->getClient()->fetchMeetingOutcomeFieldOptions($field);
}
break;
default:
$this->logger->warning('Invalid object type', [
'object_type' => $field->getObjectType(),
'field_id' => $field->getId(),
]);
throw new CrmException('Invalid object type');
}
return $this->importOptions($field, $options);
}
/**
* @inheritdoc
*/
public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage
{
$missingStage = null;
try {
// Use the HubSpot API client instead of the SDK crmPipelines() method
$endpoint = self::getDealsPipelinesEndpoint();
$pipelinesResponse = $this->client->getInstance()->getClient()->request('GET', $endpoint);
$pipelines = $pipelinesResponse->data->results;
} catch (RequestException|BadRequest $exception) {
throw $exception;
}
foreach ($pipelines as $pipeline) {
$stages = [];
// We create a business process to contain the pipeline, and store all stages against it.
$p = ResponseNormalize::normalizePipeline($pipeline);
// Create/update business process for this pipeline
$businessProcess = $this->config->businessProcesses()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'type' => BusinessProcess::TYPE_OPPORTUNITY,
'is_selectable' => $p['active'],
]);
// A record type is really a clone of the business process, used to store which record uses which pipeline.
// Create/update record type clone
$this->config->recordTypes()->updateOrCreate([
'crm_provider_id' => $p['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($p['label'], 0, 150),
'is_selectable' => $p['active'],
'business_process_id' => $businessProcess->id ?? null,
]);
// Stages - fetch all existing stages upfront to avoid N+1 queries
$existingStages = $this->config->stages()
->withTrashed()
->where('type', Stage::TYPE_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
foreach ($p['stages'] as $dealStage) {
$s = ResponseNormalize::normalizeDealStage($dealStage);
/** @var ?Stage $existingStage */
$existingStage = $existingStages->get($s['id']);
// Restore soft-deleted stages that are now active in HubSpot
if ($existingStage?->trashed() && $s['active']) {
$existingStage->restore();
}
// Upsert stage (updates soft-deleted records without restoring them)
$stage = $this->config->stages()->withTrashed()->updateOrCreate([
'crm_provider_id' => $s['id'],
], [
'team_id' => $this->team->id,
'name' => mb_strimwidth($s['label'], 0, 50),
'label' => mb_strimwidth($s['label'], 0, 191),
'type' => Stage::TYPE_OPPORTUNITY,
'sequence' => $s['displayOrder'],
'is_selectable' => $s['active'],
'probability' => $s['probability'] * 100,
]);
if ($missingStageName === $s['id']) {
$missingStage = $stage;
}
$stages[] = $stage->id;
}
$businessProcess->stages()->sync($stages);
}
return $missingStage;
}
/**
* @inheritdoc
*/
public function syncOrganization(): void
{
try {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function find(string $name, array $scopes): array
{
$count = $this->limit ?? 20;
$offset = $this->offset ?? 0;
/** @var array<int, array<string, mixed>> */
return Cache::remember(
key: $this->team->getId() . $name . $count . $offset,
ttl: 300,
callback: function () use ($name, $offset, $count): array {
$data = [];
// Use the new V3 API to find contacts based on additional fields.
foreach (['companies', 'contacts'] as $objectType) {
$endpoint = '[URL_WITH_CREDENTIALS]
*/
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$ownerId = null;
if ($crmAccountId === null) {
return $data;
}
if ($userId) {
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
$ownerId = $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
$closedStages = $this->getClosedDealStages();
$payload = $this->payloadBuilder->generateOpportunitiesSearchPayload(
$this->config,
$crmAccountId,
$closedStages,
);
$results = $this->client->getPaginatedData($payload, 'deals');
foreach ($results['results'] as $object) {
$properties = $object['properties'];
$amount = null;
if (empty($properties['amount']) === false) {
$currency = $properties['deal_currency_code'] ?? $this->config->default_currency;
// Values can contain commas and any junk so strip them.
$value = (float) preg_replace('/[^\d.]/', '', $properties['amount']);
$amount = formatCurrency($value, $currency);
}
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
if ($businessProcess === null) {
// Import it.
$stage = $this->importStages([Stage::TYPE_OPPORTUNITY], $properties['dealstage']);
$businessProcess = $this->config
->businessProcesses()
->where('crm_provider_id', $properties['pipeline'])
->first();
} else {
$stage = $businessProcess
->stages()
->where('crm_provider_id', $properties['dealstage'])
->where('type', Stage::TYPE_OPPORTUNITY)
->first();
if ($stage === null) {
// Import it.
$stage = $this->importStages(null, $properties['dealstage']);
}
}
$recordType = null;
if ($businessProcess) {
$recordType = $businessProcess->recordTypes()->first();
}
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$record = [
'crmId' => $object['id'],
'name' => $properties['dealname'] ?? 'Unknown Deal',
'value' => $amount,
'won' => $isWon,
'closed' => $isWon || $isLost,
'stage' => [
'id' => $stage?->getUuid() ?? '',
'name' => $stage?->getName() ?? '',
],
];
if ($recordType) {
$record += [
'recordType' => [
'id' => $recordType->id_string,
'name' => $recordType->name,
],
];
}
if ($ownerId && isset($properties['hubspot_owner_id']) && $properties['hubspot_owner_id'] === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
}
/**
* @inheritdoc
*/
public function getTasks(?string $objectType, string $objectId, ?string $opportunityId): array
{
$data = [];
switch ($objectType) {
case 'contact':
$hsObject = 'contact';
break;
case 'account':
$hsObject = 'company';
break;
default:
// This is a hack to prioritise and override a contact/company with a deal.
if ($opportunityId) {
$hsObject = 'deal';
$objectId = $opportunityId;
} else {
throw new InvalidArgumentException('Object type not supported.');
}
}
$engagementTypes = ['meetings', 'tasks'];
foreach ($engagementTypes as $engagementType) {
$payload = $this->payloadBuilder->getLinkToTaskPayload($hsObject, $objectId, $engagementType);
$this->logger->info('[HubSpot] CRM Search requested', [
'request' => $payload,
]);
$engagements = $this->client->getPaginatedData($payload, $engagementType);
foreach ($engagements['results'] as $engagement) {
if ($engagementType == 'meetings') {
$title = $engagement['properties']['hs_meeting_title'] ?? 'Scheduled meeting';
} elseif ($engagementType == 'tasks') {
$title = $engagement['properties']['hs_task_subject'];
} else {
$title = 'Scheduled meeting';
}
$data[] = [
'crmId' => $engagement['id'],
'subject' => $title,
'due' => $engagement['properties']['hs_timestamp'],
'type' => $engagement['properties']['hs_activity_type'] ?? null,
];
}
}
usort($data, function ($item1, $item2) {
return $item2['due'] <=> $item1['due'];
});
return $data;
}
/**
* Try to find CRM Objects using email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchExactlyByEmail(string $email, ?int $userId = null): ?array
{
$contactProperties = [
'email',
'firstname',
'lastname',
'country',
'phone',
'mobilephone',
'jobtitle',
'hubspot_owner_id',
'associatedcompanyid',
'photo',
];
$contact = null;
$account = null;
try {
$hsContact = $this->getClient()->getContactByEmail($email, $contactProperties);
if ($hsContact) {
$contact = $this->importContact($hsContact);
$account = $contact->account;
}
$data = $this->convertCrmData($contact, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
} catch (BadRequest $e) {
$this->logger->warning('[HubSpot] Search failed', [
'team_id' => $this->team->getId(),
'search_identifier' => $email,
'reason' => $e->getMessage(),
]);
}
return null;
}
public function getDomain(string $email): ?string
{
return $this->getDomainFromEmail($email);
}
/**
* Try to find CRM objects using domain name of the email address
*
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByDomain(string $domain, ?int $userId = null): ?array
{
$companyName = $domain;
// Try to find a company matching their email domain.
$companyProperties = [
'country',
'phone',
'name',
'hs_avatar_filemanager_key',
'industry',
'hubspot_owner_id',
'domain',
];
try {
$hsAccounts = $this->client
->getInstance()
->companies()
->searchByDomain($companyName, $companyProperties);
} catch (Throwable $e) {
$this->logger->info('[HubSpot] Search failed', [
'error' => $e->getMessage(),
'domain' => $domain,
]);
return null;
}
$account = null;
// If there are multiple accounts, don't guess, we'll ask later.
if (\count($hsAccounts->data->results) === 1) {
// Persist this remote object.
$account = $this->syncAccount($hsAccounts->data->results[0]->companyId);
}
$data = $this->convertCrmData(null, $account, $userId);
return ! empty(array_filter($data)) ? $data : null;
}
/**
* @return array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
protected function convertCrmData(?Contact $contact, ?Account $account, ?int $userId = null): array
{
$countryCode = null;
if ($contact && $contact->country_code) {
$countryCode = $contact->country_code;
} elseif ($account && $account->country_code) {
$countryCode = $account->country_code;
}
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact ? $contact->crm_provider_id : null,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
// If there are multiple opportunities, don't guess, we'll ask later.
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
protected function getCacheKey(string $object, ?int $userId = null): ?string
{
$key = $this->team->getId() . $object;
$keySuffix = $this->getOwnerKeySuffix($userId);
return $key . $keySuffix;
}
private function getOwnerKeySuffix(?int $userId = null): string
{
return $userId === null ? '' : (string) $userId;
}
/**
* @return null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
*}
*/
public function matchByPhone(string $phone, ?string $rawPhoneNumber = null, ?int $userId = null): ?array
{
if (str_contains($phone, '**')) {
return null;
}
// trim all whitespaces if present so the lookup doesn't fail
$phone = str_replace(' ', '', $phone);
// Check if the user is internal.
if ($this->isPhoneNumberOfTeamMember($phone)) {
return null;
}
$response = $this->searchForPhoneNumber($phone);
if (empty($response)) {
return null;
}
// This would ideally importContact instead but the response type differs.
$contact = $this->findAndSyncContact($response['results'][0]['id']);
if (! $contact instanceof Contact) {
return null;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account?->crm_provider_id,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
try {
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
} catch (Exception $e) {
$this->logger->debug('[HubSpot] Opportunity failed to sync.', [
'reason' => $e->getMessage(),
]);
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
private function isPhoneNumberOfTeamMember(string $phone): bool
{
$teamRepository = app(TeamRepository::class);
$user = $teamRepository->findTeamMemberByPhone($this->team, $phone);
if ($user instanceof User) {
return true;
}
return false;
}
private function findAndSyncContact(string $crmId): ?Contact
{
try {
return $this->syncContact($crmId);
} catch (Exception $exception) {
$this->logger->info('[HubSpot] Phone match failed', [
'reason' => $exception->getMessage(),
]);
return null;
}
}
private function hasResults(array $response): bool
{
return isset($response['total']) && is_numeric($response['total']) && $response['total'] > 0;
}
private function searchForPhoneNumber(string $phone): array
{
// Normalizes the provided phone number for the API search.
$normalizedPhone = $this->normalizePhoneNumber($phone);
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone);
$this->logger->info('[HubSpot] Phone match search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($normalizedPhone, $payload);
if (! $this->hasResults($response)) {
$nationalPhone = preg_replace('/\D/', '', phone_national(null, $phone));
$payload = $this->payloadBuilder->generatePhoneSearchPayload($nationalPhone);
$this->logger->info('[HubSpot] Phone match national number search triggered', [
'phone' => $phone,
'nationalPhone' => $nationalPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
if (! $this->hasResults($response)) {
$payload = $this->payloadBuilder->generatePhoneSearchPayload($normalizedPhone, true);
$this->logger->info('[HubSpot] Phone match alternative search triggered', [
'phone' => $phone,
'normalizedPhone' => $normalizedPhone,
'payload' => $payload,
]);
$response = $this->handlePhoneSearchRequest($phone, $payload);
}
return $this->hasResults($response) ? $response : [];
}
private function handlePhoneSearchRequest(string $phone, array $payload): array
{
$endpoint = '[URL_WITH_CREDENTIALS] null|array{
* Lead|null,
* Account|null,
* Opportunity|null,
* Contact|null,
* Stage|null,
* string|null
* }
*/
public function matchByName(string $name, ?int $userId = null): ?array
{
// Don't waste time searching for single character strings.
if (\strlen($name) <= 1) {
return null;
}
$cacheKey = $this->getCacheKey($name, $userId);
$result = Cache::remember($cacheKey, 60, function () use ($name, $userId) {
$payload = $this->payloadBuilder->generateSearchContactsByNamePayload(
$name,
$this->getContactFields()
);
$hsContacts = $this->client->getPaginatedData($payload, 'contact');
if (empty($hsContacts['results'])) {
return false;
}
$contact = $this->importContact($hsContacts['results'][0]);
if ($contact === null) {
return false;
}
$account = $contact->account;
$countryCode = $contact->country_code ?? $account->country_code ?? null;
try {
$hsOpportunities = $this->findOpportunities(
$account ? $account->crm_provider_id : null,
$contact->crm_provider_id,
$userId
);
} catch (Exception $e) {
$hsOpportunities = [];
}
$opportunity = null;
$stage = null;
if (! empty($hsOpportunities)) {
// Persist this remote object.
$opportunity = $this->syncOpportunity($hsOpportunities[0]['crmId']);
$stage = $opportunity?->getStage();
}
return [
null,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
});
return is_array($result) ? $result : null;
}
private function convertActivityAssociations(Activity $activity): array
{
return [
'contactIds' => $this->getParticipantsIds($activity),
'companyIds' => $activity->hasAccount() ? [$activity->account->crm_provider_id] : [],
'dealIds' => $activity->hasOpportunity() ? [$activity->opportunity->crm_provider_id] : [],
'ownerIds' => [],
];
}
private function getParticipantsIds(Activity $activity): array
{
$attendees = [];
$participantRepository = app(ParticipantRepository::class);
$participants = $participantRepository->getParticipantsWhoEnteredMeeting($activity);
foreach ($participants as $participant) {
if ($participant->user_id || $participant->isCoach()) {
continue;
}
$contact = $participant->contact()->first();
if ($contact && $contact->crm_provider_id) {
$attendees[] = $contact->crm_provider_id;
} else {
if (! empty($participant->name)) {
$attendeeData = $this->fetchMissingAttendeeInfo($participant);
}
if (! empty($attendeeData['id'])) {
$attendees[] = $attendeeData['id'];
}
}
}
if ($activity->hasContact()) {
$attendees[] = $activity->contact->crm_provider_id;
}
return array_unique($attendees);
}
private function fetchMissingAttendeeInfo(Participant $participant): array
{
// Check if we need to look inside an account context.
$activity = $participant->getActivity();
$companyId = $activity->hasAccount() ? $activity->getAccount()->crm_provider_id : null;
// First check the local data.
/** @var Contact[] $contacts */
$contacts = $this->team->contacts()
->with('account')
->where('name', $participant->name)
->whereNotNull('email')
->get();
foreach ($contacts as $contact) {
// If we have a company in scope, check the contact is associated to it.
if (
$companyId !== null
&& ($contact->account_id === null || $companyId !== $contact->account->crm_provider_id)
) {
continue;
}
return [
'id' => $contact->crm_provider_id,
'email' => $contact->email,
];
}
$payload = $this->generateNameSearchPayload($participant->name, 0, 20);
try {
$response = $this->client->getNewInstance()->crm()->contacts()->searchApi()->doSearch($payload);
// TODO add some logic to choose the most suitable contact if multiple
foreach ($response['results'] as $object) {
$properties = $object['properties'];
if (empty($object['properties']) === false) {
// Check the company matches the contact.
// Todo: Move this check inside the API search.
if ($companyId !== null && $companyId !== $properties['associatedcompanyid']) {
continue;
}
return [
'id' => $object['id'],
'email' => $properties['email'],
];
}
}
} catch (Exception $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Search failed', [
'teamId' => $this->team->id_string,
'request' => $payload,
'reason' => $e->getMessage(),
]);
}
return [];
}
/**
* Store transcripts as note engagement.
*
* @throws Exception
*/
public function createTranscriptNotes(Activity $activity): void
{
// For HS no need to check if Crm profile - Log Notes field is enabled
// We only check if store_transcript toggle is enabled on crm profile.
$engagement = [
'active' => true,
'ownerId' => $this->profile->crm_provider_id,
'timestamp' => $activity->created_at->tz($activity->user->timezone)->getTimestamp() * 1000,
'type' => 'NOTE',
];
// Generate activity tr...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87280
|
|
87279
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
149
1
33
1
Previous Highlighted Error
JAlSlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydWindowServerscreenpipeFirefoxCP Isolated Web ContentPerfPowerServicescoreaudiodlanguage_server_macos_armClaudeActivity Monitorbluetoothdcef_server Helper (Renderer)Postman Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxcef_serverSlack Helper (Renderer)FirefoxCP Isolated Web ContentNotion Helper (Renderer)Karabiner-Core-ServiceWispr FlowopendirectorydiTerm2cef_server Helper (GPU)Wispr Flow Helper (Renderer)launchservicesdlogd282,7182,970,468,567,310,18,27,26,76,54,64,54,02,92,82,52,42,42,42,12,02,01,91,91,71,61,51,5HelpCPU Time4:22:14,2524:07:13,676:40:59,568:07:23,013:50:48,8841:10,691:59,981:01:54,9812:04,4129:42,679:33,6921:07,249:40,247:02,0659,111:50:00,204:21,511:00:46,1917:00,9325:16,9820:52,984:25,1911:14,151:05:02,008:26,905:43,901:04:26,4317:16,43System:User:Idle:CPUMemoryEnelThreadsIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+43,41%56,59%0,00%CPUED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana NetsevaEo Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan Georgievto VesG. MiraP.. Nikolay Yankov4o James GrahamLukas Kovalik y...#: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:13Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилоример)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87279
|
|
87278
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
JAlSlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskreplaydWindowServerscreenpipeFirefoxCP Isolated Web ContentPerfPowerServicescoreaudiodlanguage_server_macos_armClaudeActivity Monitorbluetoothdcef_server Helper (Renderer)Postman Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxcef_serverSlack Helper (Renderer)FirefoxCP Isolated Web ContentNotion Helper (Renderer)Karabiner-Core-ServiceWispr FlowopendirectorydiTerm2cef_server Helper (GPU)Wispr Flow Helper (Renderer)launchservicesdlogd282,7182,970,468,567,310,18,27,26,76,54,64,54,02,92,82,52,42,42,42,12,02,01,91,91,71,61,51,5HelpCPU Time4:22:14,2524:07:13,676:40:59,568:07:23,013:50:48,8841:10,691:59,981:01:54,9812:04,4129:42,679:33,6921:07,249:40,247:02,0659,111:50:00,204:21,511:00:46,1917:00,9325:16,9820:52,984:25,1911:14,151:05:02,008:26,905:43,901:04:26,4317:16,43System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+39,92%60,08%0,00%CPUED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...#: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:10Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилоример)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87278
|
|
87277
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
7
149
1
33
1
Previous Highlighted Error
Next Highlighted Error
rapstomViewCoocWindowFV faVsco.|s ~#12121 on JY-20963-fx-l= env.locall=.env.migrate=enw.nikilocal2.env.other.env.production.env.production-eu=.env.ga=.env.gai=.[EMAIL] ide halner modelsonoMAGLAUDS.mdcomooser.soncomnoser dcldenendency.chacker.cogdew.isorEids.tyin ection ison distMEINSTAlmeMIINTERNAI WERHOOK SSTUD majiminny_storageMulicençac mallMMokerepackage-lock.isonphpstan.neon.distphostan-baseline.necc< phpunit.xmlT% raw.sal.query.saMNORAnNGMAsonar-proiect propertiesEtest.ov<Untiled Diagram.xmilis vetur.confialicMILCOUAAY CITEONS IMOIRURNTATCSamviceTesconrMmacuryochyict.on© RecordSelector.phgO ActMily prOpportunitySyncTrait.php© CrmEntityRepository.phgclass servace excenos baseservace aolesencs328329331336384392> ih External Librariesv E° Scratches and Consolesv_ Database consoledconsole isuiAOFAL RISKS (FUr419AEU CEUT* soanam arraucarrauid:string,labeuistring,value?:stringSanietane*Gihrows wnsycenra• anetunn Fieldbatal!public function importPicklistValues(Field Sfieldarray Soptions = (['id' => "*, 'label" => **, 'value' => **)): array M.../ж** Binheoitdocpublic function inportStages(Parray Stypes = null. Pstring SmissingStageNane = null): 2StagoSaissinoStage = nultaTry// Use the HubSpot APT client sinstead of the SDK crmPinelines() nethodSendooint = selt..aertenispimelanesendoofntorSpineLinesResponse = Sthis-scLient-sget/instanceD->getClient()-›request( method: 'GET' Sendooint): 1729Soinelines = SoipelinesResponse-sdata-sresults:lcatch (request Except ion BadRecuest Sexceotton)throw Sexceot.ion.foreach (Soinelines as Sosneline) !SetAdAs =/l We create a business process to contain the pipeline, and store all stages against it.Sp = ResponseNornalize::nonmaszePipeline(SpipeLine) ;Coosta/undata buefoace noocace fon thie ninoláon$businessProcess = $this->config->businessProcesses(->update0rCreate(lIane nnouidon Sat es Corisatlttoarid→ Cthfeostosnosidl'type"Iie colontahlol=> mb-strinwidth(Sof"label'1.start- All=> BusinessProcess::TYPE_OPPORTUNTTY=> Sof'active']width: 150),Man:t// Mowm/llronnoat /twdou18.2TO0У L7inu co moy toist.uServiceTest+0.=custom.loglaravel.lodA SF jiminny@localhostHSJocal jiminny@blocalhostA console (PRODasaasforce/Service.oni - 1708E17e-Н4-I17111714171417151716[17191728=1723=17221723E1721731— 1739-172-175A console (EU) X uin users (EU# console [STAGINGTc AutowPlaygroundOojiminnyORDER BY SMS COunT DESC031 49 A29 У 3 У 109 A 1SeLen ossNct usid, urenal, u,nane, u,ream io tunane as team namelt.twilio_sns_sid, t.twsllo_messaging.stcEROY usens uINNER JOIN teams t 1.n<->1: ON u.tean_id = t.1dWHERE (t.twilio_sns_sid IS NOT NULL OR t.twiLio_nessaging_sid IS NOT NULL)AND U.status = 1nense rynaed orasheSELECT * FROM teans WHERE nane LIKE "XTourhancx"; = 187, 209, 8150, salesforce-adnindtSELECTCONCAT(u.id, CASE WHEN u.id = t.ownerid THEN " (ouner)' ELSE "* END) AS user id-v.emailsa.*t.owner id FROM social accounts saJOIN users u on u.id = sa.sociable idJOIN teams t 1.n<->1: on t.id = u.tean idWHERE v.team id = 187 and sa.provider = 'salesforce':select * from activitsles where 1d = 31264367.select * from contactsselect * from accounts where id = 4156632;select * from oppontunitiles where 1d = 4843618:serccounesdoyeconsasosyoooorcuney#'staoe 1d' = 13272select * from text nelaus where created at > 12826-85-81°-select * fron actsivitsies onden by sid desciselect * fron usene nhere nane Like igSubrnke,SELECT * FROM onnontunities WHERE wnid.to_binf+04a9c6ad-2687-4453-9c72-28aeb28ccf8d*)_select * from teans where id = 555;select *rom stages where tean.iide S5ssCELECTaomaslCONCAT(u.id, CASE WHEN U.id = t.owner id THEN • (onner)* ELSE ** END) AS user idsa.*t.owner_id FROM sociat_accounts satniM ncong man tdeea cadahloJOIN teams ton t.id = u.tean 1dWHERE U.team id = 10€ and sa.provider = 'hubspot':Cascadeles Orcnnworeebeeionhnves ohtine oDonPitocottoe nhcoo..orobabiity" s Moar catal setadata"orobabto tyhThis s the root causeHere's the full explanation:Root eause:moor Stages overwmes D 8 orobablliy with Huosoor's valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44 . The stage crm provider 1d: "closedtost" isHubSpot's standard "Closed Lost" stage which natively has probability ® in HubSpot.2. ImportStages() runs (during any pipeline/stage sync), It callsService.php:445-454Sstage = Sthis->config-ostages()-withTrashed()->update0rCreate(l"crm_provider_1d a 55l-10"JPebbsitencetorosbliew'113. sattorobabsTtu"1 comas from RestonscNorenKaer.roms WrebenlStaoe"orobability" a (4loat) (Saataf"retadata"|("orobabfWity'122 1.HubSpot returns netadata.probability = e for closedlost. So $s['probability") * 100 • 0. This resets stage 20616's probability back to 0 in tho4. Now getClosedDealStaces() outs "closedlost" into lostll (orobability 0), not woni5. The deal syncs → is_von = false, is_closed = truetha connonss of muonte.May 4After May 4Stace 20616 probability manually changed to 100 in Jiminny DAmortStanes () runr → resetr staae 20616 probability back to 0 (frem HubSpot)May 20Dral synos → *closedlost» is in lostll (orob=0) = ts won = falarThe opportunitye atane ta in etill 20616 (the stage reeord ID never changed), but by the time it suncad on May 20, iroortStages had already resct theprobability of that stage back to 0. So when bui ldOpportunityData runs, "closedlost" is in lost(I, not von!!The core issue: inportStages always overwrites the DB probability with whatever HubSpot says. Any manual probability customisation in Jiminny getswiped out the next time stages are synoed from HubSpot. Stage 20616 was manually set to 100 but the label says "7. Won (Contract Signed)" while theHibSoot em omuider da le cloadilost = HibSootte nativa orobability for that is Ouso ft cate racatGuntaAsk anvthing (XoLCANANUMMad Tos1740-22 12 charcll llite.g...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87277
|
|
87276
|
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'
BIORUrapstomFV faVsco.s ~= env.locall=.env.migrate=enw.nikilocal2.env.other.env.production.env.production-eu=.env.ga=.env.ga=.[EMAIL] ChangesLog: origin/JY-18908-ask-minny-on-demandv Chances 7 TesE env local apd©Jiminnydebuacommand.ohoaop/console/commandsphe loadina, cho contiol(c Pavback serice ono aoo Serviced@ ProspectCache.oho ano/Services/Crme)Carvica sho son Samosel em htacooei Camvica soo aoa samosd em Sadlorchvovars onad siae oteanu nikilocat andhau arher non( ConAeeneeA:PonorteTaet oho thetehl lnit/Dolicineowastalocelliminov.csoatowarhmmoa.non.hanlehaenicammandeKKavicon ied mihrdE ids.txt appTraw_sgL_query.sgl app© SimulateWebhooksCommand.php app/Console/Commands/Crm/HubspotM4 WEBHOOK_FILTERING_IMPLEMENTATION.md appCoocWindowDeleteObjectsTrait.phgUmacurayscrict.on© RecordSelector.phgOpportunitySyncTrait.php© CrmEntityRepository.phdclass servace excenos baseservace aolesentspubuzc tunccion anooristades tarray suypes & null, estrane sissangscagenane & nulleiscadd} catch (RequestException|BadRequest Sexception) {foreach (Sp['stages'] as SdealStage) €Ss = ResponseNornalize::noma zzebea.Stage(SoeatStage):/** Evac ?Stage Sexistingstage */SeystoinastadeSeyistongsacpsooers1d/l Restore soft-deleted stages that are now active in Hubspot1f (SexistingStage?»›trashed) da Ssl'active')) 1Seysstnostacessrestonelo// Upsert stage (updates soft-deleted records without restoring then)Sstage = Sthis->config-›stages->withTrashed->update0rCreate(['crn_provider_id' => $s["id').1, 0"tean&dl= Sthfsosteanosfa=> ab_strinwidth($s['label').=> ab strinuidth(Ss ("label'start:8, width: 50),width: 191)eanedla y# Contents are identica@ ebbaab95 app/Services/Crm/Hubspot/Service.phpSmissingStage = null:try 4I/ Use the HubSpot API client instead of the SOK crmPipelines( methodSendpoint = self::getDealsPipelinesEndpoint@=SpipelinesResponse = Sthis->client->getInstance()->getClient(->request('GET". Sendpoint)Spipelínes = SpipelinesResponse->data-›resultscauch keques exceoczon badkequest sexceocronnnon Sexceo elon:foreach (SofocLines as SpineLine) !Sstages = (1:// We create a business process to contain the pipeline, and store all stages against it.So= PesoonselonnaLize:.nornal.izePfine bine Soinelbine)erpate /undate bussiness nrocess fon thiis inineibineSbusinessProcess = Sthis->config->businessProcesses->update0rCreate(['crn_provider_id' => Sp["id")=custom.loglaravel.lodA SF jiminny@localhostHSJocal jiminny@localhostA console (PROD2720-172117221725ОЕ ВОШО 1 1В ПО1ФНЕ П00И1181 11733 V83222A console (EU) X uin users (EU# console [STAGINGDo jiminnycreated_at > 2020-05E031 49 A29 У 3 У 109 ^select * from activities order by id desc:select * from users where nane like 'Subrax'SELECT * FROM ODPOntUniEieS WHERE wuid to bin(: 84a9cfed-2087-4455-9073-28ae578ect8d: 5=Select * TrOuceals were z0 sos"select * Tron Scades nnere ceanzo 8 oo5ECONCAT(U-1d, CASE NHEN U.id E E. OMner jd THEN (Onner) ELSE END) AS USen do =nerrxun Soo accountssJusk users u on u.id = sa.sochable.2oJOTM teans + 1.nc->1: on tiid = uatean toteheurwmenosorowcerEosoTO0У L7inu co my lostuServiceTestCecsdales Orcnnworeebeeionhnves dohtine Oooond+0.Pitocottoe nhcoo..60orobabuty" s Tloat (icatalcetadata"orobabto tym)hThis ks the root causdRoot eause:moor Stanes overwmes DB orobablliy with Huosoor's valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44. The stage crn provider 1d: "closedtost" isHubSpot's standard "Closed Lost" stage which natively has probability e in HubSpot2. ImportStages() runs (during any pipeline/stage sync), It callsservice.php:445-454Sstage = Sthis-contio-ostages-ithtrashed=updatcorcreateerorowideressio cetorosbliewr1Mek snuthinaMotC7cootS? AdaotivNo diherench.HideCuront MorehnrSaissingStage = nulltry// Use the HubSpot API client instead of the SDK crmPipelines() nethocSendpoint = self::getDealsPipelinesEndpointoSpipelinesResponse = Sthis->client-›getInstance@->getClient()->request('GET'. Sendpoint)Spipelines = SpipelinesResponse->data->results:} catch (RequestException|BadRequest Sexception) ^hnow rxecoretonforeach (SoineLines as SpineLine)Sstages = [1;// We create a businSn= Resnonselornaisize::nomoila zePiine ine (Sorne bine)l:iopate/undate hustiness arocess ton this oinebingSbusinessProcess = Sthis-›config->businessProcesses()->update0rCreateCteomuncovsder d' o SoredeD.OI/ Mow milron noat /tadou 18.nNOMNud Tosm1740-22 12 charel...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87276
|
|
87275
|
IAISlackFileEditViewGoHistoryWindowActivity Monito IAISlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskscreenpipereplaydWindowServerSlack Helper (Renderer)language_server_macos_armFirefoxCP Isolated Web ContentcoreaudiodSlackbluetoothdActivity Monitorcef_serverClaudeFirefoxPerfPowerServicescef_server Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentopendirectorydWispr FlowiTerm2cef_server Helper (GPU)launchservicesdWispr Flow Helper (Renderer)Karabiner-Core-ServiceControl Centrelogd251,4176,094,566,642,823,322,010,37,24,74,53,83,63,53,22,92,82,72,62,52,31,81,61,61,61,51,41,4HelpCPU Time4:21:45,4624:06:54,613:50:40,686:40:53,888:07:15,971:00:45,9212:03,8041:09,631:01:54,2214:05,8121:06,769:33,224:21,3829:42,121:49:59.951:58,939:40,0217:00,6458,8311:13,934:24,981:05:01,798:26,801:04:25,905:43,7320:52,7920:47,7817:16,28System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+48,35%51,53%0,12%CPUED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana NetsevaEo Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:04Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87275
|
|
87274
|
rapstomCoocWindowFV faVsco.s ~= env.locallUmacuray rapstomCoocWindowFV faVsco.s ~= env.locallUmacurayscrict.on=.env.migrate=enw.nikilocal© CrmEntityRepository.phd2.env.other.env.production.env.production-eu=.env.ga=.env.ga=.[EMAIL] servace excenos baseservace aolesencsд9дд9д8pubuzc tunccion anooristades tarray suypes & nult, tsurane sssangscagenane & nulle escade?string SmissingStageNane = null): ?StageD):// Stages • tetch alt existing stages upfront to avoid Nei querzesSexistnostaces = sthisescontgostagese.thiirachecoohere'tyne'race.ew?e tptRtlter-aeten-›keyBy( crn_provider_10);wp.ono-cs-ixer.dis..onowp.phpstorm.meta.phpE.phounit.result.cacheE.pretticrianoretaneach n"staces"las real wadeSs = ResponseNormalize::normalizebealStage (SdealStage):.windsurirules/** Qvac ?Stage SexistingStage */SexistingStage = SexistingStages-›get(Ss["id"))MAGLAUDS.mdcomooser.soncomnoser dclRestore soft-dalated ctadas that ana now actaive Sn HubSoot1f (SexistingStage?->trashed() && Ss['active']) €SexistingStage->restoreOLocal ChangesLog: origin/JY-18908-ask-minny-on-demandeanedlayLog xv Chances 7 es, uodatino.E env local apdTO→ Side-by-side viewer@ebbaab95 app/Services/Crm/Hubspot/Service.phpDo not ianocey©Jiminnydebuacommand.ohoaop/console/commandsphe loadina, cho contiolSmissingStage = null:(c Pavback serice ono aoo Serviced@ ProspectCache.oho apo/Services/Cmtry 4e Carvica shoaorUse the HubSpot API client instead of the SOK craPipelineso methodei Camvica soo aoa samosd em SadlorchsenosoiaeocruerocenchodonoSpipeLinesResponse = Sthis->cLient->getInstance@->getClientO->request("GET". Sendpoint)Unversioned Files 9 files, updatinganu nikilocat andSotociaines = sotocuneskesponse->dara->resu.shau other norcatch (RequestException|BadReguest Sexception) «( ConAeeneeA:PonorteTaet oho thetehl lnit/DolicineThrou sexceotion?oCrastalocelliminov.soatowrhmmaoa.non.honleaaenhieammandereaKKavicon ied mihrdE ids.txt appTraw_sgL_query.sgl app© SimulateWebhooksCommand.php app/Console/Commands/Crm/HubspotM4 WEBHOOK_FILTERING_IMPLEMENTATION.md app=custom.loglaravei.io"A SF jiminny@localhostHSJocal jiminny@localhostA console (PRODA console (EU) X uin users (EU# console [STAGINGDo liminny vcreated_at > 2020-09 2USBYBUYSYWAselect * from activities order by id desc:-1721select * from users where nane like 'Subrax"SELECT * FROM opportunities WHERE uuid to bin(*B4a9cfad-2c87-4453-9e72-28aeb78ccf8d* }-Select * Troceals were z0 sos"select * Tron Scades nnere ceanzo 8 oo5stleulCONCAT(U.1d, CASE WHEN U.id = t.ouner id THEN • (Ouner)' ELSE * END) AS user 1d =nerrxun Soo accountssJusk users u on u.id = sa.sochable.2oteneurwmneinosorowdereosooTO0У L7inu co moy tostuServiceTestCecsdales Orcnnworeeoeionhnves dohtine Oooond+0.Pitocottoe nhcoo..60orobabuty" s Tloat (icatalcetadata"orobabto tym)hThis ks the root causdRoot eause: moorStages overwmes D3 probability with tuoSpots valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44. The stage crn provider 1d: "closedtost" is2. ImportStages() runs (during any pipeline/stage sync), It callsservice.php:445-454Sstage = Sthis-contio-ostages-ithtrashed=updatcorcreateerorowideressio cetorosbliewr1Mek snuthinaMotC7cootS? AdaotivCurant versiontryUse the HubSpot API client instead of the SDK cr-Pipelines nethodSendpoint = self::getDeals/*public function inportStages(Parray Stypes = null, ?string SmissingStageNane = null)): ?StagoSmissingStage = null;tey"I Use the HubSpot APT client instead of the SOK crnPipelines@) nethodSendpoint = self::get0ealsPioelinesEndoointoSpipeLinesResponse = Sthis->cliento›getinstance@->getClient()->request('GET'. Sendooint))soipeluines @ soroeldinescesconse-scata-resultsj catch (RequestException|BadRequest Sexception) {thron Sexcept on.foneach (Spipelines as Spipeline)Sstades=ne coeste a muesnass ncocase no conrasin the ninelbiine and store ail cradas aoasnst"Sn = ResponseMonnal $ze««nornal 3zePineline(Soineline).1ditterenceNOMNud Tosm1740-22 12 chare...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87274
|
|
87273
|
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
Code changed:
Hide
IAISlackFileEditViewGoHistoryWindowActivity MonitorAll ProcessesProcess Name% CPUPhpStormkernel_taskscreenpipereplaydWindowServerSlack Helper (Renderer)language_server_macos_armFirefoxCP Isolated Web ContentcoreaudiodSlackbluetoothdActivity Monitorcef_serverClaudeFirefoxPerfPowerServicescef_server Helper (Renderer)FirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentopendirectorydWispr FlowiTerm2cef_server Helper (GPU)launchservicesdWispr Flow Helper (Renderer)Karabiner-Core-ServiceControl Centrelogd251,4176,094,566,642,823,322,010,37,24,74,53,83,63,53,22,92,82,72,62,52,31,81,61,61,61,51,41,4HelpCPU Time4:21:45,4624:06:54,613:50:40,686:40:53,888:07:15,971:00:45,9212:03,8041:09,631:01:54,2214:05,8121:06,769:33,224:21,3829:42,121:49:59.951:58,939:40,0217:00,6458,8311:13,934:24,981:05:01,798:26,801:04:25,905:43,7320:52,7920:47,7817:16,28System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+41,20%58,80%0,00%CPUED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana NetsevaEo Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:31:01Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87273
|
|
87272
|
rapstomCoocWindowFV faVsco.s ~=enwlocallUmacuraysc rapstomCoocWindowFV faVsco.s ~=enwlocallUmacurayscrict.on=.env.migrate=enw.nikilocal© CrmEntityRepository.phd2.env.other.env.production.env.production-eu=.env.ga=.env.ga=.[EMAIL] servace excenos baseservace aolesentspubuzc tunccion anooristades tarray suypes & nult, tsurane sssangscagenane & nulle escade?string SmissingStageNane = null): ?StageaagaselD):// Stages • tetch alt existing stages upfront to avoid Nei querzesSexistnostaces = sthisescontgostagese.ohere'tyne'race.ew?e tptRtlter-aeten-›keyBy( crn_provider_10);wp.ono-cs-ixer.dis..onowp.phpstorm.meta.phpE.phounit.result.cacheE.pretticrianoretaneach n"staces"las real wadeSs = ResponseNormalize::normalizebealStage (SdealStage):.windsurirules/** Qvac ?Stage SexistingStage */SexistingStage = SexistingStages-›get(Ss["id"))MAGLAUDS.mdcomooser.soncomnoser dclRastone soft-delatad staoas that ana now actaiva Sn HubSoot1f (SexistingStage?->trashed() && Ss['active']) ‹SexistingStage->restoreOLocal ChangesLog: origin/JY-18908-ask-minny-on-demandeanedlayLog xv Changes 7 files.E env local apd©Jiminnydebuacommand.ohoaop/console/commandsTO→ Side-by-side viewerDo not ianocey@ ebbaab95 app/Services/PlaybackService.phpnSentcoss Piavardi Sonico& opoerateVed aPlavlistlwAaphe loadina, cho contiolC Pavbackserice ono aoo sennced© ProspectCache.php app/Services/CrmeSarvica sho aod damoselem "tocoon@ Sarvice nhn ano/SanicaslCrm/SolastorchStean = Strack->getActivity->getUser@->getTeam0Enumerate and delete all segnents.foreach (Splaylist i"nediaSegnents' as Ssegment)vovars onad siae oteSsegnent P'uri' = client cdn(Ssegment ('uni'il, Stean):F .env.nikilocal apphau other norCanACCessAiReportsTest.php tests/Unit/PoliciesoCrastalocelliminov.soatowrhmmaod.non.honleanenieammandekSplaylisti*EXT-X-PLAYLTST-TYPE*] = "VOD':Splavlisti'EXT-X-ENDLTST'] = true:KKavicon ied mihrdE ids.txt appTraw_sgLquery.sgl app© SimulateWebhooksCommand.php app/Console/Commands/Crm/HubspotM4 WEBHOOK_FILTERING_IMPLEMENTATION.md appServiceTestinu co moy tostul+0.=custom.loglaravei.io"A SF jiminny@localhostHSJocal jiminny@localhostA console (PRODA console (EU) X uin users (EU# console [STAGINGDo jiminnycreated_at > 2020-05 €USBYBUYSYWAselect * from activities order by id desc-1721select * from users where nane like 'Subrax"SELECT * FROM opportunáties NHERE uuid_to_bin(*84a9cfad-2c87-4453-9e72-28aeb78ccf8d*=Select * Troceans mere 20 = sosselect * Tron Scades nnere ceanzo 8 oo5stleulCONCAT(u.id, CASE WHEN U.id = t.owner id THEN • (onner)' ELSE •* END) AS user iderxxun Soc &CCounssJusk users u on u.id = sa.sochable.2oteke urwnne ino sHoroudereosoomeesdales Orcnnworeebeeionhnves ohtine oDonaPetooeteorobabiity" s Moar catal setadata"orobabto tyhThis ks the root causdRoot eause:moorStages overwmes D8 probabllty with Huosoots valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44. The stage crn provider 1d: "closedtost" is2. ImportStages() runs (during any pipeline/stage sync), It callsservice.php:445-454Sstage = Sthis→contio-ostages-ithtrashed=updatcordreateo cetorosbliewr1CcooeS? Adaotiv1ditteenctCumant varsioSteam = Strack->getActivity@->getUser@->getTeam0Enumenate and delete all segments.foreach (SplayList" "mediaSegnents" as Ssegaent)Ssegnent ("uni' = client con(Ssegment "uri'. Stcan)SplayZisti'EXT-X-PLAYLIST-TYPE* = *VOD'SplayZisti'EXT-X-ENDLIST') = truelNOMNud TosmLTE9 AensA...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87272
|
|
87271
|
JAlSlackFileEditViewGoHistoryWindowHelpActivity Mo JAlSlackFileEditViewGoHistoryWindowHelpActivity MonitorAll ProcessesProcess Name% CPUCPU TimePhpStormkernel_taskscreenpipeWindowServerreplaydPostman Helper (Renderer)FirefoxCP Isolated Web Contentlanguage_server_macos_armlaunchservicesdcoreaudiodmds_storesFirefoxbluetoothdtccdActivity MonitorFirefoxCP Isolated Web Contentcef_server Helper (Renderer)FirefoxCP Isolated Web ContentsyspolicydopendirectorydClaudeFirefoxCP Isolated Web ContentiTerm2Wispr FlowFirefoxtrustdSlack Helper (Renderer)Notion Helper (Renderer)262,54:21:32,22177,796,446,624:06:45,343:50:35,708:07:13,7137,06:40:50,3816,67:00,9910,49,541:09,0912:02,641:04:25,821:01:53,841:10:34,591:49:59,7821:06,529:17,909:33,0217:00,509:39,8858,6917:29,0711:13,7929:41,9413:38,741:05:01,704:24,8614:27,785:21,361:00:44,7025:16,70System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+47,06%52,00%0,94%CPUED→Jiminny...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messages(L. Iliyana NetsevaEo Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko KashinskiGalya Dimitrova: Todor Stamatov. Steliyan GeorgievEo Ves8. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:30:58Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87271
|
|
87270
|
ranchesrapstomCoocWindowFV faVsco.|s ~= env.locall ranchesrapstomCoocWindowFV faVsco.|s ~= env.locallCmkcurayocryict.on© RecordSelector.phg=.env.migrate=enw.nikilocalOpportunitySyncTrait.php© CrmEntityRepository.phd2.env.other.env.production.env.production-eu=.env.ga=.env.ga=.[EMAIL] service excenos baseservace molesencsGGGGдAя8pubuzc tunccion anooriscades tarray suypes & nult, estrane s ssangscagenane & nulue escade?string SmissingStageNane = null): ?StageD):// Stages • tetch alt existing stages upfront to avoid Nei querzesSexistnostaces = sthisescontgostagese.wThlirachecionohere'tynelrace.ew?e tpptRtlltes-aeten-›keyBy( crn_provider_10);wp.ono-cs-ixer.dis..onowp.phpstorm.meta.php.ohounit.resulcacheE.pretticrianoreforeach (Spl'stages as SdealStage) 1Ss = ResponseNormalize::normalizebealStage (SdealStage):.windsurirules/** Qvac ?Stage SexistingStage */SexistingStage = SexistingStages-›get(Ss["id"))M?CLAUDE md449comnoser.soncomnoser.ockRastone soft-delatad staoas that ana now actaiva Sn HubSoot1f (SexistingStage?->trashed() && Ss['active']) €SexistingStage->restoreOloanl Chandd.Log: origin/JY-18908-ask-minny-on-demandeoneala. Text orhasBranchv User v Date v Paths vVasrkl normal ne tlocost tesconse datalc assJY-19263 normalize Hubspot pipeline response dataAdd coverace to toameUse overloadingRAmOvA DO CHASCTAGJy-18908 Fix testswonoonothyHighlight wordsx 13@ 2reach lsoineuneso%cararas SofoesineSstagesnineWe crpate a business arocess to contain the ninelbine. and store aill stages aoaiingt stNornalsze onelbindso Sthisosnomat izepinel ine (Soineline)Create/update business process for this pipelineSbusinessProcess = Sthis->conf_q->businessProcesses->update0rCreate'crn provider id' => Spl'id'tonttt//Wow.m/llron.1oat/twdou18.2=custom.loglaravei.io"A SF jiminny@localhostHSJocal jiminny@blocalhostA console (PRODA console (EU X iin users (EU)# console [STAGINGpiiwarouodvDo liminny vcreated_at > 2020-05 €USBYBU YS YWAselect * from activities order by id desc-172%select * from users where nane like 'Subrax'SELECT * FROM opportunities WHERE uuid to bin('84a9cfad-2c87-4453-9e72-28aeb78ccf8d' -Select * Troceans nnere zo s sosselect * from stages where tean id = 555stleulCONCAT(u.id, CASE WHEN U.id = t.owner id THEN • (onner)' ELSE •* END) AS user idnerrxun Soo accountssJusk users u on u.id = sa.sochable.2oteke urwnne ino sHoroudereosooIHII DTO0%7Ao inu comoy lorsbioServiceTestmeesdales Orcnnworeeoeionhnves dohtine Oooond+0.60orobabiity" s Moar catal setadata"orobabto tyhThis s the root causeRoot eause:moorStages overwmes D8 probabiiity with Huospots valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44. The stage crn provider 1d: "closedtost" is2. ImportStages() runs (during any pipeline/stage sync), It callsservice.php:445-454Sstage = Sthis→contio-ostages-ithtrashed=updatcordreateCrprowideresido cetorosbliewr1S? AdaotivkolawoNikolay NikolovMamacXortonxovDSGO02.10.25, 18:433.1075.13:043.10.25, 11:583.10.25, 11:47484$10whns/swwicseem/lthenatad PoenoncoMormalizo nhoNwoeronorniaze tuosoer rosconse dhtenss51b55094foreach (Soine Lineso>data as Spineline) !Sstagesnine// We create a business process to contain the pipeline, and store all stages against itSp = ResponseNornalize::normalizePipeline(Spipeline);49g// Create/update business process for this pipelineSbusinessProcess = Sthis->config->businessProcesses()-›update0rCreate(n"ene anowiden a es Soltial508509Stagesaharanen...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87270
|
|
87269
|
rapstomCoocWindowFV faVsco.s ~#12121 on JY-20963-f rapstomCoocWindowFV faVsco.s ~#12121 on JY-20963-fx-lproideteTPAmoremo newehoResponseNormalize.phoUmacurayochict.ongsevice.on:esunchiorcdon.onGSUNCKOlOhCWWWKeweonooinlneochhoe>D IntearationAod>O Listeners>& Metadatala Pipedrivev SalestorceaFelds•ao poortunityMatchenOpportunitySyncStrategy> ProspectsearchStrategyC) e entondC Decorate ctimm cnolnaldtsor weetihooooead natioitionenno© PayloadBuilder.phpalorotis noo© QueryBuilder.php© QueryHandler.php© Queryiterator.phoo QueryRest condo Service.ond© SyncBatchRedisService.ptTraitelRasedlientondbaseservice.oneconiooekesowod() CrmActivityProviderinteorateCCINTCMINMOronoweauiwostenee3indsProscectinterace.on3MatchDomsinsvamsinteraeC Ooportur vActvtwwatchec Prosoectenche.ondcOrnenontCostchCtttammDrnenontCostrhCtratomcntoei orawdoroo etr nhnTO0У L7Thu 28 May 18:30:53ServiceTest+0.© RecordSelector.phg© Activity.phoOpportunitySyncTrait.php© CrmEntityRepository.phdclass servace excenos baseservace aolesentspubuzc tunccion anooriscades tarray suypes & nult, estrane s ssangscagenane & nulue escadepustze tuncezon amportstages(zarray Stypes & noll, ?string SmlssingStageNane & null): ?Stage// Stages • tetch alt existing stages upfront to avoid Nei querzesSexistnostaces = sthisescontgostagese.thiirachecoohere'tyne'race.ew?e tptRtlter-aeten-›keyBy( crn_provider_10);taneach n"staces"las real wadeSs = ResponseNormalize::normalizebealStage(SdealStage):/** Qvac ?Stage SexistingStage */SexistingStage = SexistingStages-›get(Ss["id"))// Restore soft-deleted stages that are now active in HubSpot1f (SexistingStage?->trashed() && Ss['active']) ‹SexistingStage->restoreO/ Upsert stage (updates soft-deleted records without restoning them.Sstage = Sthis->config->stages@-›withTrashed@->update0rCreateCh"crn provider id" = Ssi"id'"tean_id"= 57h15-27688-210= nb strinwidth(Ssf'label'start: 0width: 58)"Labela no stoinuorhiss"abewidth:90ma> Stage:"TYPEOPPORTUNEIYAssosolavirder"Sis selectable' a>› Ssf'active').a> sorobabtuty' *188)3€ (SaissinoStagelane ae Salial)Sasssinosrace = Schade:Sstages(] = Sstage->id;ChuefnaseProcneecsetncneh.seune (Cetaonelreturn SnissingStage:pinolinaeSndnofnt?SpinelinesResponse = Sthis-›client-›getInstance@)->getCLient->request( method: "GET'. Sendooint):ew oul teoneet today 1Rey=custom.loglaravel.lodA SF jiminny@localhostHSJocal jiminny@blocalhostA console (PRODasaasforce/Service.oni1699170017851710=171117121713171417141722=172317251726_172817291735117AVEi7se17391746A console (EU) X uin users (EU# console [STAGINGTc AutowPlaygroundOojiminnyURUEk bY sms count bese031 49 A29 V 3 У 109 A 1SELECT DISTINCT u.íd, u.enail, u.name, u.tcan_id, t.nane as team_namet.twilio_sns_sid. t.twilfo.messaging.sid111FRON users uINNER JOIN teans t (1.n<->1: ON U.tean,id = t.idWHERE EWEUOSEs SIdS NOTNULL URT.rwRoonessagino.sids NoT NuuwAND U.status = 1RoEk dynare MhenasiSELECT * FRON teans WHERE nane LIKE "stounlanex; # 187, 20%, 8158, salesforce-adningtSELECTCONCAT(U.1d, CASE WHEN U.10 = t.owner_1d THEN' (ouner)" ELSE" END) AS user_10.U.emailsa.*t.owner_id FROM social_accounts saJOIN users u on u.id = sa.sociable_idJOIN teams t 1.nc->1: on t.id = u.tean_1cWHERE u.team_id = 187 and sa.provider = 'salesfonce':select * from activities where id = 31264367.beleet k thon contacrt anere zo = osslosyselect * from accounts where id = 4156632:select * from opportunities where id = 4843618:# update "activitios" set 'account id' = 4156632, "contactid' = 6331639, 'opportunity# 'stage-id" = 13273'activitios'. "undated_at* = 2826-85-22 07:16:17 where $1d* = 3420select * from text relays where created at > *2826-05-01*;select * rom acrvimes order oy dd descaselect * from usens where nane Like "ySubrak"SELECT * FROM opportunitsies WHERE wuid to_bin(*B4a9cfad-2c87-4453-9e72-28aeb78ccf8d*)_select * from teans where 1d = 555;select * from stages where tean. 1d = 555%CONCAT(u.id, CASE WHEN u.1d = t.owner id THEN • (oaner)' ELSE ** END) AS USen 3alt.owner_id FROM social_accounts sahitin neene non tar ea socsahileJOIN teams t 1.n<->1: on t.id = u.tean_ioWHERE u.team_id = SSS and sa.provider = 'hubspot":Cascadeles Orcnnworeebeeionhnves ohtine oDonPitocottoe nhcoo..orobabuty" s Tloat (icatalcetadata"orobabto tym)hThis s the root causeHere's the full explanation:Root eause: moorStaces overwntes DB orobabilty with Huospot's valueThe flow is1. Someone manually changed stage 20616's probability in the Jiminny DB to 100.00 on 2826-45-44. The stage crn provider 1d: "closedtost" isHubSpot's standard "Closed Lost" stage which natively has probability ® in HubSpot.2. ImportStages() runs (during any pipeline/stage sync), It callsService.php:445-454Sstage = Sthis->config-ostages()-withTrashed()->update0rCreate(lerorowideressiPebbsitencetorosbliew'113. sattorobabsTtu"1 comas from RestonscNorenKaer.roms WrebenlStaoe"orobability" a (4loat) (Saataf"retadata"|("orobabfWity'122 1.HubSpot returns netadata.probability = e for closedlost. So $s['probability") * 100 • 0. This resets stage 20616's probability back to 0 in tho4. Now getClosedDealStaces() outs "closedlost" into lostll (orobability 0), not woni5. The deal syncs → is_von = false, is_closed = truetha connonss of muonte.May 4After May 4Stace 20616 probability manually changed to 100 in Jiminny DAmortStanes () runr → resetr staae 20616 probability back to 0 (frem HubSpot)May 20Dral synos → *closedlost» is in lostll (orob=0) = ts won = falarThe opportunitye atane ta in etill 20616 (the stage record ID never changed), but by the time it suncad on May 20, iroortStages had already reset theprobability of that stage back to 0. So when bui ldOpportunityData runs, "closedlost" is in lost(I, not von!!The core issue: inportStages always overwrites the DB probability with whatever HubSpot says. Any manual probability customisation in Jiminny getswiped out the next time stages are synoed from HubSpot. Stage 20616 was manually set to 100 but the label says *7. Won (Contract Signed)" while thiHibSoot em omuidar da le cloesdilost = HibSootie nativa orobability for that is Ouso it cate racanGuntaAt anthientua$ AdhotsI Woderd Thams 1740:22 UTE-R A/A enod...
|
PhpStorm
|
faVsco.js – console [EU]
|
NULL
|
87269
|
|
87268
|
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
Code changed:
Hide
Sync Changes
Hide This Notification
JAlSlackFileEditViewGoHistoryWindowHelpActivity MonitorAll ProcessesProcess Name% CPUCPU TimePhpStormkernel_taskWindowServerscreenpipereplaydlanguage_server_macos_armmds_storesFirefoxCP Isolated Web ContentcoreaudiodClaudecef_serverActivity Monitorcef_server Helper (Renderer)SlackbluetoothdFirefoxFirefoxCP Isolated Web ContentFirefoxCP Isolated Web ContentNotion Helper (Renderer)cef_server Helper (GPU)ierm2Wispr FlowSlack Helper (Renderer)Karabiner-Core-ServiceFirefoxCP Isolated Web ContentControl CentreWispr Flow Helper (Renderer)FirefoxCP Isolated Web Content218,64:21:18,31191,074,924:06:35,9272,48:07:11,243:50:30,5966,816,112,811,36:40:48,4212:02,141:10:34,2341:08,541:01:53,4329:41,804:21,159:32,799:39,7014:05,5321:06,281:49:59,4217:00,3158,5325:16,618:26,651:05:01,584:24,751:00:44,6020:52,6432:28,6120:47,645:43,5613:38,61System:User:Idle:Threads CPUMemoryEnelIdle Wake-UpsKp HomeDMsActivityFilesLater..•More+44,24%55,64%0,12%CPUED→Jiminny ...# infrastructure_dev# jbu-team-info# jiminny-bg# platform-team# platform-tickets# product_launches# random# releases# support# thank-yous# the_people_of jimi...Direct messagesEL. Iliyana Netseva€o Vasil Vasilev&. Stefka Stoyanovao Stoyan TomovEo Petko Kashinski. Galya Dimitrova: Todor Stamatov. Steliyan Georgievto VesG. MiraP.. Nikolay Yankovdo James GrahamE Lukas Kovalik y...::: AppsJira Cloud(alo)100% <78• Thu 28 May 18:30:51Describe what you are looking forlliyana Netseva6 0• Messagest Add canvas+една заявка (Asked hиилопимер)Today~тука не съм сигурен, по-скоро е за продуктlliyana Netseva 4:00 PMok, thank youlliyana Netseva 5:45 PMИмам питане и се чудя кьм кого мога да сеобърна?става дума за deal insightsLukas Kovalik 5:54 PMПитай, ако мога ще отговоряlliyana Netseva 5:56 PMимам сделка която е със статус won но е вclosed losttova e ID-to 04a9cfad-2c87-4453-9e72-20aeb78ccf8d na sdelkataLukas Kovalik 6:00 PMUS или EU (edited)lliyana Netseva 6:01 PMeuLukas Kovalik 6:27 PMвиждам че си отворила тикет, ще го видя утренещо се умазало sync на stagesмисля клиент е променил нещо трябва да говидя в самия hubspotMessage Iliyana Netseva...
|
PhpStorm
|
faVsco.js – Hubspot/Service.php
|
NULL
|
87268
|