Source of file ConnectLeadsAndConversations.php
Size: 5,216 Bytes - Last Modified: 2021-12-23T10:37:44+00:00
/var/www/docs.ssmods.com/process/src/code/Task/ConnectLeadsAndConversations.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | <?php namespace SilverStripe\Intercom\Task; use SilverStripe\Dev\BuildTask; use Guzzle\Service\Resource\Model; use SilverStripe\Core\Injector\Injector; use SilverStripe\Intercom\Intercom; use SilverStripe\Intercom\Model\Conversation; use SilverStripe\Intercom\Model\Lead; use SilverStripe\Control\HTTPRequest; use stdClass; class ConnectLeadsAndConversations extends BuildTask { /** * @var array * * @config */ private static $connectors = []; /** * @var string * * @config */ private static $assignment_admin_id; /** * @inheritdoc * * @param SS_HTTPRequest $request */ public function run($request) { $client = Injector::inst()->get(Intercom::class); $connectors = $this->getConnectors(); /** @var Model $response */ $response = $client->getClient()->leads->getLeads([ "created_since" => 1, ]); $contacts = $response->contacts; foreach ($connectors as $connector) { foreach ($contacts as $i => $contact) { $existingLead = Lead::get() ->filter("IntercomID", $contact->id) ->first(); if (!$existingLead) { $existingLead = Lead::create(); $existingLead->IntercomID = $contact->id; $existingLead->IsAssigned = false; $existingLead->write(); } if ($existingLead->IsAssigned) { continue; } /** @var Model $response */ $response = $client->getClient()->notes->getNotes([ "id" => $contact->id, ]); $notes = $response->notes; $contactArray = json_decode(json_encode($contact), true); if (!$connector->shouldConnect($contactArray, $notes)) { continue; } $existingConversation = Conversation::get() ->filter("LeadID", $contact->id) ->first(); if (!$existingConversation) { $client->getClient()->messages->create([ "body" => $connector->getMessage($contactArray, $notes), "from" => [ "type" => "contact", "id" => $contact->id ] ]); /** @var Model $response */ $response = $client->getClient()->conversations->getConversations([ "intercom_user_id" => $contact->id, ]); $conversations = $response->conversations; $existingConversation = Conversation::create(); $existingConversation->LeadID = $existingLead->ID; $existingConversation->IntercomID = $conversations[0]["id"]; $existingConversation->write(); } $client->getClient()->conversations->replyToConversation([ "id" => $existingConversation->IntercomID, "type" => "admin", "message_type" => "note", "body" => join("\n\n", array_map(function ($note) { return $note->body; }, $notes)), "admin_id" => $this->config()->assignment_admin_id, ]); $teamIdentifier = $connector->getTeamIdentifier($contactArray, $notes); if ($teamIdentifier) { $client->getClient()->conversations->replyToConversation([ "id" => $existingConversation->IntercomID, "type" => "admin", "message_type" => "assignment", "admin_id" => $this->config()->assignment_admin_id, "assignee_id" => $teamIdentifier, ]); } $tags = $connector->getTags($contactArray, $notes); if (!empty($tags)) { foreach ($tags as $tag) { $client->getClient()->tags->tag([ "name" => $tag, "users" => [ ["id" => $contact->id], ], ]); } } $existingLead->IsAssigned = true; $existingLead->write(); } } } /** * @return LeadAndConversationConnector[] */ private function getConnectors() { /** @var StdClass $config */ $config = $this->config(); $classes = (array)$config->connectors; $mapped = array_map(function ($class) { return Injector::inst()->create($class); }, $classes); $filtered = array_filter($mapped, function ($connector) { return $connector instanceof LeadAndConversationConnector; }); return $filtered; } } |